Programming 89

MSA API 호출 성능개선 방안 - Redis 활용

기존의 Spring에서도 공통코드, 메뉴코드와 같이 데이터 변경이 잘없는 호출은 SpringCache를 활용하였다. 이 컨셉을 계승하여 MSA에 적용하는 사례를 소개코자 한다. 그리고 Redis Cache로 외부 Cache 저장소를 사용할 것이다. Github 소스코드 https://github.com/armyost/ApiRedisTemplate GitHub - armyost/ApiRedisTemplate: This is api call template with redis cache This is api call template with redis cache. Contribute to armyost/ApiRedisTemplate development by creating an account on GitH..

Programming/기타 2023.09.18

SpringSecurity로 OAuth 인증인가 구현. Kakao 소셜인증을 서버로..

아래는 OAuth 2.0 표준을 따라 UserInfo Endpoint에서 사용자 정보를 가져오는 예제입니다. ※ 대부분의 Posting에는 Token Payload를 JWT Claim을 통해서 데이터를 복호화 하는 방법이 소개되어 있습니다. Git 주소 https://github.com/armyost/Oauth2Sample/tree/main GitHub - armyost/Oauth2Sample: This is OAuth2 Authentication sample with SpringSecurity This is OAuth2 Authentication sample with SpringSecurity - GitHub - armyost/Oauth2Sample: This is OAuth2 Authenticatio..

Programming/Java 2023.09.12

Spring Security Filter Chain 설명

Spring Security는 인증,인가에 대해 개발자가 필요한 로직을 대부분 구현해 놓았다고 보면 된다. 웬만한 인증인가에 필요한 로직이 다 있음. 따라서 적극적으로 사용하는 것이 문명의 혜택을 누리는 것이라 생각한다. https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/web/builders/HttpSecurity.html 필터설명 SecurityContectPersistenceFilter SecurityContexRepository에서 SecurityContext를 로드하고 저장하는 일을 담당함. LogoutFilter 로그아웃 URL로 지정된 가상URL에 대..

Programming/Java 2023.09.06

SpringFramework 에서 Redis 를 활용한 Session Storage 분리

- SpringSession & Redis관련 Bean 생성 ※ SpringSession 라이브러리는 Clustered Session 제공을 위해 Servlet에 비종속적인 Session LifeCycle 관리 라이브러리 ※ 스크립트 위치 : /src/main/resources/egovframework/spring/context-*.xml - RedisTemplate Bean 생성 ( Template의 경우 커스텀한 설정이 필요할 수 있어 JAVA Config로 정의함) @Configuration public class SessionConfig { private LettuceConnectionFactory redisConnectionFactory; @Autowired public SessionConfig..

Programming/Java 2023.09.06

코드 품질올리기, 코드 설계 - 3 성숙한 클래스 만들기 (3/3)

1) 단일 책임 원칙 : Class가 담당하는 책임은 하나로 제한해야 한다. 책임을 대신지는 Class가 만들어지면 다른 클래스가 제대로 성장할 수 없습니다. 중복을 제거하다보면 실수로 책무를 생각하지 않고 중복을 제거하는 경우가 있습니다. 그렇게 되면 하나로 모인 로직이 여러 책무를 담당해야 합니다. 모든 지식은 시스템 내에서 한번만 애매하지 않고 권위있게 표현되어야 합니다. 중복이 발생하더라도 중복제거 과정으로 인해 단일 책무가 위협을 받을때는 중복을 허용해야 합니다. 그리고 하나의 로직으로 봐야하는 흐름이 두 클래스에 분산되어 있는 설계는 좋은 설계라고 말할 수 없습니다. 2) 슈퍼클래스 의존을 탈피하기 위해서는 상속보다는 컴포지션이 좋습니다. 컴포지션이란 사용하고 싶은 클래스를 private 인스..

Programming/기타 2023.08.30

코드 품질올리기, 코드 설계 - 3 성숙한 클래스 만들기 (2/3)

1) 응집도를 저해하는 것들 static 메서드는 인스턴스 변수를 사용할 수 없습니다. 따라서 데이터와 데이터 로직사이에 괴리가 생깁니다. 즉 응집도가 낮아집니다. static 메서드는 로그 출력 전용메서드, 포맷 변환 전용 메서드, 팩토리 메서드등 응집도와 관계없는 기능을 static 으로 정의하면 좋습니다. private 생성자, 팩토리 메서드를 사용해 목적에 따라 초기화 하기 올바른예 class GiftPoint { private static final int MIN_POINT = 0; private static final int STANDARD_MEMBERSHIP_POINT = 3000; private static final int PREMIUM_MEMBERSHIP_POINT = 10000; pr..

Programming/기타 2023.08.30

코드 품질올리기, 코드 설계 - 3 성숙한 클래스 만들기 (1/3)

1) 클래스는 클래스 하나로도 잘 동작할 수 있도록 설계해야 합니다. 또한 복잡한 초기 설정을 하지 않아도 곧바로 사용할 수 있게 해야합니다. 모든 클래스는 자기방어 임무가 있습니다. 다른 클래스를 사용하여 초기화하거나 유효성 검사를 해야하는 클래스는 그 자체로는 안전하게 사용할 수 없는 미성숙한 클래스 입니다. 올바른 예 Class Money { final int amount; final Currency currency; Money(int amount, Currency) { if (amount < 0){ throw new IllegalArgumentException("금액은 0 이상의 값을 지정해 주세요."); } if (currency == null) { throw new NullPointerExce..

Programming/기타 2023.08.30

코드 품질올리기, 코드 설계 - 2 분기중접 줄이기 (3/3)

이미 존재하는 기능을 다른 방법으로 구현할 필요는 없습니다. 1) 조건을 만족하는 요소가 컬렉션 내부에 하나라도 포함되어 있는 경우 잘못된 예 boolean hasPrisonKey = false; // items List 자료형 for (Item each : items){ if (each.name.equals("감옥열쇠")){ hasPrisonKey = true; break; } } 이 기능을 간단하게 아래와 같이 구현할 수 있습니다. 올바른 예 boolean hasPrisonKey = items.stream().anyMatch( item -> item.name.quals("감옥열쇠") ); 이렇게 anyMatch를 사용하면 for 반복문과 if 조건문을 사용할 필요도 없이 한 줄로 처리를 완료할 수 있..

Programming/기타 2023.08.28

코드 품질올리기, 코드 설계 - 2 분기중접 줄이기 (1/3)

가. 이해하기 어렵게 만드는 분기중첩 조건 분기는 조건에 따라 처리 방식을 다르게 하는데 사용되는 프로그래밍 언어의 기본 제어 구조입니다. 그런데 조건 분기를 어설프게 사용하면 악마가 되어 개발자를 괴롭힙니다. 잘못된 예 if ( 0 < member.hitPoint ) { //살아 있는가? if (member.canAct()) { //움직일 수 있는가? if(magic.costMagicPoint

Programming/기타 2023.08.28