Controller와 Service 레이어 간 의존성 관리
2022. 4. 15. 18:03
Spring
컨트롤러와 서비스 레이어 간 파라미터 의존성 관리를 어떻게 해야할까? 고민한 내용은 간단하다. Controller → Service로 파라미터를 넘길 때 의존도를 어떻게 할지이다. Controller @GetMapping(value = "/members/me", produces = MediaType.APPLICATION_JSON_VALUE) public MemberResponse findMemberOfMine(@Login LoginMember loginMember) { Member member = memberService.findMemberOfMine(loginMember.getEmail()); return new MemberResponse(member); } Service @Transactional(r..
@NotNull vs @Column(nullable = false)
2022. 4. 15. 14:09
Spring
서론 여기까지 고민하게 된 계기는 Entity에서 필드 검증을 직접해야 할까? 였다. 그러면 항상 로직을 짜아하고, null체크와 같은 것들은 굉장히 중복되는 것들인데 모든 Entity에 비슷한 코드가 들어가게 된다. 그리고 Entity 검증 테스트를 작성할 필요가 있을까? 단순한 검증 로직 귀찮은데? 기존에는 아래 코드와 같이 직접 StringUtils.isBlank와 같이 검증을 했다. 그리고 테스트 작성도 했다. @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; @Column(nullable = false) private Str..
@Configuration과 @TestConfiguration
2022. 4. 15. 12:48
Spring
문제점 OAuth 로그인을 구현하다 보니, 로그인 테스트를 작성하기 위해 OAuth에 요청 로직을 목킹해야하는 일이 생겼다. 어차피 OAuth 서비스는 요청만 잘하면 정상적인 동작이 보장되므로 실제로 요청할 필요가 없기 때문이다. 내가 테스트해야 하는 것은 요청에 의해 받아온 승인코드, accessToken, 회원 정보들을 조합하여 나의 서비스에 로그인이 되는지 회원가입이 되는지에 대한 것이다. 하지만 이를 인터셉터에서 처리하고 있다보니, 어떻게 목킹해야 할지 고민하게 되었다. @TestConfiguration을 사용했는데 안된다. 여러 글을 찾아보니 @TestConfiguration을 사용하면 된다는 것을 알게 되었다. 먼저 코드 구조는 WebConfig에서 실제 환경 인터셉터를 구성하고, TestWe..
로그인 처리는 Filter와 Interceptor중 무엇을 선택해야 할까?
2022. 4. 11. 19:27
Spring
Filter와 Interceptor(로그인 처리, 스프링) 서론 토이 프로젝트로 로그인을 인터셉터로 구현하던 중이었다. 그런데 팀원 중 한 분이 시큐리티는 필터를 사용하는데 무엇을 써야할지에 대한 의문을 내셨다. 나는 인터셉터가 제공하는 기능들이 편리하기 때문에 사용했는데 조금 더 알아보기로 했다. 차이점 Filter와 Interceptor는 실행 시점이 다르다. Filter는 스프링 밖에 Web Application에 존재하고, Interceptor는 스프링에 존재한다. Filter는 스프링에 오기 전에 처리할 수 있기 때문에 스프링까지 들어오는 필요를 줄여준다. Interceptor는 스프링이 기능을 제공하기 때문에 편리하다. 대략 이런 내용들이 많다. @ExceptionHandler 솔직히 경험이 ..
Interceptor 예외를 @ExceptionHandler가 핸들링 가능할까?
2022. 4. 11. 18:42
Spring
Interceptor에서 예외를 응답 해주는 방법 postman 요청은 성공? 다른 서버에서는 실패? // /error 는 스프링 부트가 제공하고 있기 때문에 커스텀 해도 스프링을 타게 되기 때문에(BasicErrorController.java) // /api/error 와 같이 커스텀 해야한다. request.setAttribute("message", "로그인이 필요한 서비스"); request.getRequestDispatcher("/error").forward(request, response); 문제 HandlerInterceptor에서 예외를 RestControllerAdvice가 핸들링하지 못한다. 상황이 어떤가 살펴보자. 소셜 로그인을 시도한다. authorization code가 유효하지 않..
Spring Rest Docs를 사용하는 이유와 사용하지 않을 이유
2022. 3. 26. 20:15
Spring
Spring Rest Docs VS Swagger 서론 팀원들과 Rest Docs와 Swagger 중 무엇을 고민할지 상의했다. 결과적으로는 나의 생각과는 다르게 Rest Docs를 선택했다. Swagger도 튜토리얼 정도만 해봤기 때문에 둘의 장단점을 명확하게 공감하지는 못한다. 그래서 이번에는 팀원들의 의견을 따라 Rest Docs를 사용하며, 장단점을 느껴보자. Spring Rest Docs VS Swagger Spring Rest Docs Swagger 장점 프로덕션 코드에 영향이 없다. 문서상에 API를 테스트할 수 있는 기능이있다. 테스트 코드가 성공해야 문서 작성이 가능하다. 테스트 코드가 필요없으므로 적용이 쉽다. 단점 테스트 코드를 작성해야 하므로 적용이 불편하다. 프로덕션 코드에 테스트..
스프링에서 싱글톤 빈을 사용해도 위험하지 않은가?
2022. 2. 14. 23:26
Spring
스프링은 싱글톤 빈인데 어떻게 여러 요청을 한 번에 처리하지? 이런 생각이 든 이유는 10개의 요청이 들어왔다고 할 때 싱글톤 빈들을 공유할텐데 어떻게 같이 사용하지? 요청당 쓰레드가 할당 되는 것은 맞는데 이상한데?? 모르겠다. 그냥 뭔가 이상했다. 이상한 점 멀티 쓰레드가 하나의 빈을 사용할 수 있나? 기다려야 하는 것 아닌가? 동시에 사용이 가능하다면 값이 변경되면 위험한거 아닌가? 어떻게 한개의 빈이 여러 요청을 처리할 수 있는거지? 해당 글을 읽고나니 당연하게 알고 있는 내용이었다. 그래도 정리 해보자. 멀티 쓰레드가 하나의 빈을 사용할 수 있나? 기다려야 하는 것 아닌가? 멀티 쓰레드는 CPU당 하나의 쓰레드를 기본적으로 생성하게 된다. CPU가 4개이면 8개의 쓰레드를 2개씩 나누어서 한다고..
스프링 HTTP 메시지 컨버터
2022. 2. 14. 22:34
Spring
HTTP 메시지 컨버터 뷰 템플릿으로 HTML을 생성해서 응답하지 않고, HTTP API처럼 JSON 데이터를 HTTP 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편리하다. HTTP 메시지 컨버터란? 요청 및 응답이 왔을 경우 HttpServlet등을 하위 레벨을 사용하면 직접 request, response 객체에 write도 하고 여러가지 작업을 직접 해야하므로 불편하기 때문에 이를 편리하게 사용할 수 있도록 @ReqeustBody, @ResponseBody 등을 읽어 사용하기 편한 형태로 제공하는 컨버터이다. 스프링 MVC는 어떤 상황에 HTTP 컨버터를 사용할까? @ReqeustBody, HttpEntity(RequestEntity) @ResponseBody, HttpEnt..