분류 전체보기 1341

Netflix Zuul - Filter 적용

Filter Class 생성 @Slf4j @Component //Bean으로 등록 public class ZuulLoggingFilter extends ZuulFilter { //로그를 출력해 줄 필터 //Logger logger = LoggerFactory.getLogger(ZuulLoggingFilter.class); @Override public Object run() throws ZuulException { log.info("************ printing logs : "); RequestContext ctx = RequestContext.getCurrentContext(); //Context를 얻어온다 HttpServletRequest request = ctx.getRequest(); l..

API Gateway Service

클라이언트 대신 동작하고, 응답을 제공하는 프록시 역할을 한다. 클라이언트 사이드에서 마이크로 서비스를 직접 호출(앤드 포인트) 하기에 MicroService가 변경되거나 추가가 되면 클라이언트 사이드에 영향이 있다. 코드를 수정하여 빌드베포를 다시 해야 한다. 클라이언트로부터 들어오는 요청을 API Gateway에서 모두 처리해준다. 직접적으로 MicroService를 접근하지 않고 API Gateway에 접근한다. 장점 인증 및 권한 부여 서비스 검색 통합 응답 캐싱 정책, 회로 차단기 및 QoS 다시 시도 속도 제한 부하 분산 로깅, 추적, 상관관계 헤더, 쿼리 문자열 및 청구 변환 IP 허용 목록에 추가 Netflix Ribbon Client Side Load Balancer 서비스 이름으로 호출..

프로젝트에 도움이 되는 URL

REST API URI를 결정하는 7가지 규칙 [번역글] REST API URI를 결정하는 7가지 규칙 REST API URI를 결정하는 7가지 규칙 7가지 규칙은 파악하기 쉽고 필요한 모든 자원과 정보를 전달하는 충돌위험이 적은 URI를 쓸 수 있도록 해줄 것입니다. REST API URI 규칙에 대해 넘어가기 전에 우 sas-study.tistory.com 규칙 1 : 후행 슬래쉬(/)는 URI에 포함되지 않아야 합니다. 규칙 2 : 계층관계를 나타낼 때 슬래시 구분자를 사용해야합니다. 규칙 3 : URI의 가독성을 높이기 위해서 하이픈(-) 문자를 사용합니다. 규칙 4 : 언더바( _ ) 문자는 URI에 사용하지 않습니다. 규칙 5 : URI를 작성하는 데에는 소문자가 적합하다. 규칙 6 : 파일확..

Ch06. 스프링과 문제 해결(예외 처리, 반복) - JDBC 반복 문제 해결( JdbcTemplate)

지금까지 서비스 계층의 순수함을 유지하기 위해 수많은 노력을 했고, 덕분에 서비스 계층의 순수함을 유지하게 되었다. 이번에는 리포지토리에서 JDBC를 사용하기 때문에 발생하는 반복 문제를 해결해보자. 커넥션 조회, 커넥션 동기화 PreparedStatement 생성 및 파라미터 바인딩 쿼리 실행 결과 바인딩 예외 발생시 스프링 예외 변환기 실행 리소스 종료 리포지토리의 각각의 메서드를 살펴보면 상당히 많은 부분이 반복된다. 이런 반복을 효과적으로 처리하는 방법이 바로 템플릿 콜백 패턴이다. 스프링은 JDBC의 반복 문제를 해결하기 위해 JdbcTemplate이라는 템플릿을 제공한다. /** * jdbcTemplate 사용 */ @Slf4j public class MemberRepositoryV5 impl..

Ch06. 스프링과 문제 해결(예외 처리, 반복) - 스프링 예외 추상화 적용

스프링이 제공하는 데이터 접근 예외 추상화와 SQL 예외 변환기를 적용해보자 /** * SQLExceptionTranslator 추가 */ @Slf4j public class MemberRepositoryV4_2 implements MemberRepository { private final DataSource dataSource; private final SQLExceptionTranslator exTranslator; public MemberRepositoryV4_2(DataSource dataSource) { this.dataSource = dataSource; this.exTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource); //DB 정..

Ch06. 스프링과 문제 해결(예외 처리, 반복) - 스프링 예외 추상화 이해

스프링은 데이터 접근 계층에 대한 수십 가지 예외를 정리해서 일관된 예외 계층을 제공한다. 각각의 예외는 특정 기술에 종속적이지 않게 설계되어 있다. 따라서 서비스 계층에서도 스프링이 제공하는 예외를 사용하면 된다. 예를 들어서 JDBC 기술을 사용하든, JPA 기술을 사용하든 스프링이 제공하는 예외를 사용하면 된다. JDBC나 JPA를 사용할 때 발생하는 예외를 스프링이 제공하는 예외로 변환해주는 역할도 스프링이 제공한다. 예외의 최고 상위는 org.springframework.dao.DataAccessException이다. 그림에서 보는 것처럼 런타임 예외를 상속받았기 때문에 스프링이 제공하는 데이터 접근 계층의 모든 예외는 런타임 예외이다. DataAccessException 은 크게 2가지로 구분..

Ch06. 스프링과 문제 해결(예외 처리, 반복) - 데이터 접근 예외 직접 만들기

데이터베이스 오류에 따라서 특정 예외는 복구하고 싶을 수 있다. 예를 들어서 회원 가입 시 DB에 이미 같은 ID가 있으면 ID 뒤에 숫자를 붙여서 새로운 ID를 만들어야 한다고 가정해보자. ID를 hello라고 가입 시도했는데, 이미 같은 아이디가 있으면 hello12345와 같이 뒤에 임의의 숫자를 붙여서 가입하는 것이다. 데이터를 DB에 저장할 때 같은 ID가 이미 데이터베이스에 저장되어 있다면, 데이터베이스는 오류 코드를 반환하고, 이 오류 코드를 받은 JDBC 드라이버는 SQLException 을 던진다. 그리고 SQLException 에는 데이터베이스가 제공하는 errorCode라는 것이 들어있다. SQLException 내부에 들어있는 errorCode 를 활용하면 데이터베이스에서 어떤 문제..

Ch06. 스프링과 문제 해결(예외 처리, 반복) - 런타임 예외 적용

MemberRepository 인터페이스 작성 public interface MemberRepository { Member save(Member member); Member findById(String memberId); void update(String memberId, int money); void delete(String memberId); } MyDbException : SQLException -> RuntimeException public class MyDbException extends RuntimeException{ public MyDbException() { } public MyDbException(String message) { super(message); } public MyDbExce..

Ch06. 스프링과 문제 해결(예외 처리, 반복) - 체크 예외와 인터페이스

서비스 계층은 가급적 특정 구현 기술에 의존하지 않고, 순수하게 유지하는 것이 좋다. 이렇게 하려면 예외에 대한 의존도 함께 해결해야 한다 예를 들어서 서비스가 처리할 수 없는 SQLException에 대한 의존을 제거하려면 어떻게 해야 할까? 서비스가 처리할 수 없으므로 리포지토리가 던지는 SQLException 체크 예외를 런타임 예외로 전환해서 서비스 계층에 던지자. 이렇게 하면 서비스 계층이 해당 예외를 무시할 수 있기 때문에, 특정 구현 기술에 의존하는 부분을 제거하고 서비스 계층을 순수하게 유지할 수 있다 인터페이스 도입 이렇게 인터페이스를 도입하면 MemberService는 MemberRepository 인터페이스에만 의존하면 된다. 이제 구현 기술을 변경하고 싶으면 DI를 사용해서 Memb..