Server/Spring 51

Spring - REST API에서 직접 정의한 Error code를 사용하는 이유!

네이버나 카카오 Open API를 보면 Error Response 스펙에 서비스가 자체적으로 정의한 code를 사용한다. API 레퍼런스 kakao: https://developers.kakao.com/docs/latest/ko/reference/rest-api-reference#response naver: https://developers.naver.com/docs/common/openapiguide/errorcode.md 이는 REST API의 Error Response를 이해하기 위해서는 문서를 봐야한다는 치명적인 단점이 있다. 그럼에도 불구하고 직접 정의한 Error code를 사용하는 이유에 대해 알아보자. 개요 이번 주 회사에서 Mail API를 개발 중인 선배분께서 자리로 오셔서 이런 말씀을..

Server/Spring 2022.07.03

Spring - REST에서 예외를 처리하는 다양한 방법!

Spring에서 예외 처리를 구현하는 다양한 방법에 대해 알아본다. Spring 3.2 이전에는 Spring MVC 애플리케이션에서 예외를 처리하는 대표적인 두 가지 방식이 있었다. HandlerExceptionResolver 또는 @ExceptionHandler 애노테이션이었다. 해당 방법들은 분명한 단점이 있었다. Spring 3.2 부터는 이전의 두 솔루션의 단점을 극복하고 통합 예외 처리를 유도하기 위해 @ControllerAdvice 애노테이션을 사용했다. 그리고 Spring 5부터 REST API에서 기본 예외를 처리하기 위해 ResponseStatusException을 제공한다. 이들은 관심사 분리를 훌륭하게 처리한다. Solution 1. @ExceptionHandler Controller..

Server/Spring 2022.07.03

Spring - JpaRepository와 Querydsl 연결하기! (사용자 정의 리포지토리)

우리는 자바 스프링으로 웹 서버를 개발할 때 Spring Data JPA와 QueryDSL을 동시에 사용하게 된다. 문제는 JpaRepository는 인터페이스이고, QuerydslRepository는 클래스이다. 그래서 흔히 아래의 두 클래스를 따로 구현하곤 한다. UserJpaRepository UserQuerydslRepository 이를 해결하기 위한 방법을 알아보자. 사용자 정의 리포지토리 사용자 정의 리포지토리를 사용하면 이런 문제를 해결할 수 있다. 사용자 정의 리포지토리는 다음과 같이 사용한다. 사용자 정의 인터페이스 생성 (상속 X) 사용자 정의 인터페이스 구현 JpaRepository에 사용자 정의 인터페이스 상속 Class Diagram으로 아래와 같이 표현할 수 있다. 구현 먼저..

Server/Spring 2022.06.18

SpringBoot - 프로퍼티를 안전하게 가져오는 방법!

개발을 하다보면 클래스에서 프로퍼티(Properties)를 가져오는 일이 종종 생긴다. 더 효율적이고 안전한 방법에 대해 알아보자. 예제를 위한 application.yml 상태는 다음과 같다. directory: root-path: /app/ temp-path: /temp/ @Value 가장 간단하게 값을 주입받는 방식이다. @Value 애노테이션에 프로퍼티 경로를 적으면 값이 주입된다. @Getter public class DirectoryProperties { @Value("${app.directory.root-path}") private String rootPath; @Value("${app.directory.temp-path}") private String tempPath; } 이 방식은 간단하..

Server/Spring 2022.06.14

SpringBoot - @SpringBootTest vs @WebMvcTest

백기선님의 강의 영상을 보고 Mvc 통합테스트를 하는 방법을 익혔다. 하지만 현업에서 그렇게 했을 때 생기는 문제점을 피드백 받았고, 컨트롤러를 테스트 하는 두 가지 방법이 있음을 알게 되었다. 예제 코드 아래의 예제를 보자. [TestController] @RestController @RequiredArgsConstructor public class TestController { private TestService testService; @GetMapping("/hello") public String hello() { return "Controller : " + testService.hello(); } } [TestService] @Service public class TestService { publ..

Server/Spring 2022.05.30

QueryDSL - Repository 구조잡기 (extends / implements 사용 X)

해당 포스팅은 "[우아콘2020] 수십억건에서 QUERYDSL 사용하기" 라는 영상의 내용을 정리한 글입니다. 해당 영상은 아래 Reference에서 시청할 수 있습니다. - https://www.youtube.com/watch?v=zMAX7g6rO_Y extends / implements 사용하지 않기 현업에서 JPA & QueryDSL-JPA를 많이 사용한다. Repository를 구현할 떄는 다음의 같은 구조로 구현할 수 있다. 사용할 Repository가 JpaRepository를 상속받고 RepositoryCustom이라는 별도의 인터페이스를 추가적으로 상속을 받는다. 그리고 해당 인터페이스의 구현체인 RepositoryImpl을 생성하게 된다. 해당 방법은 매번 Interface와 Impl 구..

Server/Spring 2022.05.29

Spring - Multi DataSource 환경에서 Transaction, QueryDSL 사용하는 방법

다중 데이터 소스다중 데이터 소스 환경에서 Transaction과 Querydsl을 사용하는 방법에 대해 알아보자.먼저 데이터소스부터 보자.@Configuration@EnableJpaRepositories( basePackageClasses = { OrderRepository.class }, entityManagerFactoryRef = "masterEntityManagerFactory", transactionManagerRef = "masterTransactionManager")@EnableTransactionManagementpublic class MasterDatasourceConfiguration { @Autowired private Environment env; ..

Server/Spring 2022.05.21

Spring - 필터(Filter)와 인터셉터(Interceptor)의 차이

필터(Filter) / 인터셉터(Interceptor) / AOP 스프링에서 요청이 구현한 Controller Layer로 들어오기 전에 처리해야 하는 작업이 있다. 대표적으로 인증 인가, XSS 방어, 데이터 압축, 인코딩 등이 있다. 이러한 작업들은 공통 관심사로 보고 분리하는 것이 것이 효율적이다. 이때 사용할 수 있는 것이 필터(Filter)와 인터셉터(Interceptor), Spring AOP이다. 문제는 해당 기술들이 어떠한 장단점이 있으며, 어떤 경우에 적합한 지 또는 어떤 경우에 부적절한 지 등이 정리가 잘 되어있지 않다. 해당 포스팅에서는 그러한 기준을 정리한다. 필터(Filter) 필터(Filter)는 스프링이 지원하는 기능이 아닌, J2EE 표준 스펙에 있는 기능으로 가장 앞단에 존..

Server/Spring 2022.04.27

Spring Boot - Thread Pool을 관리하는 방법! (Spring Boot에서의 Thread 기본 원리) [ThreadPoolExecutor]

ThreadPool의 동작을 이해하는 것이 개발하는 앱 서버에 영향을 미칠까..?! ThreadPool은 응답 시간, 처리 속도, TPS에 영향을 미친다. 추가로 병목 현상, CPU 오버헤드, 메모리 부족 등의 문제를 방지해서 안정적인 어플리케이션의 운용이 가능하게 합니다. 즉, ThreadPool에 대한 기본적인 개념을 알아야 더 좋은 Server Application을 개발할 수 있습니다. Java - Threading Model Java에서는 One-to-One Threading-Model로 Thread를 생성합니다. One-to-One Threading-Model은 User Thread(Process의 스레드) 1개는 OS Thread 1개와 연결해야 합니다. 이때 작업 요청이 들어올 때마다 Th..

Server/Spring 2022.04.16

Spring - 프로필 (Profile)

프로필이란 ? 유지보수 작업 중에는 서비스로 운영중인 DB를 사용할 수 없습니다. 그래서 로컬 개발 환경과 실제 서비스 환경은 동일하지 않는 경우가 많습니다. 개발할 때는 로컬 개발 환경에 맞게 데이터베이스 서버의 IP, 계정, 디렉터리 경로, URL등을 수정한 후에, 개발을 끝내고, 다시 실제 서비스 환경으로 변경한 후에 배포해야합니다. 이 때, 실수를 범할 수도 있고 불편하기 때문에 스프링이 제공하는 기능이 프로필(Profile)입니다. 프로필을 이용하면 개발용 프로필, 서비스용 프로필을 하나씩 만들고 원하는 프로필을 이용해서 스프링 컨테이너를 초기화할 수 있습니다. 즉, 프로필을 선택함에 따라 그에 걸맞는 설정을 적용할 수 있습니다. C언어의 #define, #if를 사용해서 국가나 환경에 따라 코..

Server/Spring 2021.01.29