Spring & Springboot

@DataJpaTest의 동작 방식과 몇 가지 주의사항

1. @DataJpaTest @DataJpaTest는 이름에서 알 수 있듯이 JPA Component의 테스트에 집중하기 위한 어노테이션입니다. 위 사진의 빨간색 박스로 표시한 내용을 자세히 읽어보면 크게 세 가지 특징이 있습니다. 첫째, @DataJpaTest는 Transactional하며 각 테스트의 마지막에 롤백을 합니다. 둘째, 기본적으로 in-memory DB를 사용하며, @AutoConfigureTestDatabase 어노테이션을 통해 사용자가 지정하는 DB로 설정할 수 있습니다. 셋째, Bean 스캔의 범위가 한정적입니다. 어플리케이션에서 등록한 모든 Bean을 대상으로 테스트를 하기 위해서는 @SpringBootTest를 사용해야 합니다. 각 내용에 대해 자세히 설명해보겠습니다. 2. Ro..

2023.02.12 게시됨

Spring & Springboot

Spring Bean VS StaticClass

Spring bean과 Static 함수의 생성 시점은 아래와 같습니다. [1] Spring bean : JVM 로드 → Tomcat 실행 → Component Scan 시점 [2] StaticClass Method : JVM에서 클래스가 메모리에 올라가는 시점 이 사실을 보면 Spring Bean 생성 시점보다 StaticClass 내부의 Method 생성 시점이 앞선다는 것을 알 수 있습니다. 뿐만 아니라, Spring bean과 StaticClass의 Method 모두 싱글톤을 보장한다는 점에서 공통점을 가집니다. 그렇다면 'Spring Bean을 대체해서 StaticClass를 정의해서 사용해도 될까'하는 의구심(?)이 스쳐지나가는데요. 이번 포스팅에서는 둘 사이의 차이점에 대해 짚어보고 어떤 상..

2022.12.10 게시됨

Spring & Springboot

Spring AOP 스터디 - (3) 프록시 객체의 내부 메서드 호출 문제

1. 문제 이번 글에서는 Spring AOP를 공부할 때 반드시 알아야 할 프록시 객체의 내부 메서드 호출 문제에 대해 다뤄보려고 합니다. 테스트 환경을 만들기 위해 이전 글에서 작성했던 예제 코드 일부를 조금 수정해보겠습니다. [UserService.java] @Service @RequiredArgsConstructor @Import(PerfAspect.class) public class UserService { private final UserRepository userRepository; public void save(User user) throws UserAlreadyExistException{ if(isAlreadyExistUser(user)){ throw new UserAlreadyExistE..

2022.11.20 게시됨

Spring & Springboot

Spring AOP 스터디 - (2) @Aspect 기반 AOP 적용

지난 포스팅에서는 'AOP가 왜 필요한가'에 대해 알아보고 AOP를 이해하는 데 필요한 몇 가지 용어들을 정리했습니다. AOP의 기본적인 개념에 대해 궁금하신 분은 위 글을 참고해주시면 좋겠습니다. 이번 시간은 지난 포스팅에서 문제 삼았던 코드를 AOP 기반으로 수정해보면서 Spring AOP가 동작하는 방식을 이해해보겠습니다. 1. 문제의 코드 지난 포스팅에서 예제로 사용했던 문제의 컨트롤러입니다. @RestController @RequiredArgsConstructor @Slf4j public class UserController { private final UserService userService; @PostMapping("/user") public String userSave(String ema..

2022.10.21 게시됨

Spring & Springboot

Spring AOP 스터디 - (1) AOP의 필요성과 기본적인 동작 원리

0. 들어가면서 이번 글부터는 몇 개의 연재글을 통해 Spring AOP에 대해 공부해보려고 합니다. 벌써 몇 번째 글을 수정하고 다시 쓰고 하는 것 같은데, 그만큼 Spring AOP를 이해하고 설명하는 데는 꽤 시간이 많이 드는 것 같습니다. 어쨌든, 이번 글에서는 Spring AOP의 기본적인 개념과 필요성을 예제 코드로 확인해보고 AOP와 관련된 기본적인 용어를 정리해보겠습니다. 그리고 다음 글에서부터는 예제 코드에 Spring AOP를 적용해보면서 어떻게 코드가 개선될 수 있으며, 이로 인해 얻을 수 있는 장점은 무엇인지 눈으로 확인해보겠습니다. 1. AOP와 객체지향 Aspect-Oriented Programming (AOP)complements Object-Oriented Programmin..

2022.10.18 게시됨

Spring & Springboot

Spring Security - SecurityContextHolder에서 로그인 사용자 정보 가져오기

0. 문제 Spring Security, JWT을 이용해 로그인이나 권한 처리 등의 작업을 하다 보면 "로그인을 한 사용자의 정보를 어떻게 가져와야 할까"에 대한 고민을 하게 됩니다. 토큰을 어디에 저장하고 어떤 방식으로 사용하느냐에 따라 조금씩 다른 문제겠지만 근본적으로는 발급된 토큰을 가지고 현재 권한을 가진 사용자가 자유롭게 서비스를 이용할 수 있어야 하고, 해당 사용자가 누구인지 서버에서도 바로 알 수 있어야 하는 게 당연하기도 합니다. 그럼에도 불구하고 이 내용에 대해 글을 쓰기 전에는 토큰이 아니라 아래처럼 사용자 자체가 가지고 있는 필드 정보를 가지고 DB에서 사용자를 다시 찾아서 사용했었습니다. 사용자의 Email, Username, Nickname, PK 등의 고유값을 입력(전달)받는다...

2022.08.03 게시됨

Spring & Springboot

Entity 필드가 가지는 Enum값의 목록은 어떻게 가져와야 할까?

1. 문제 엔티티가 가지는 필드의 값을 특정한 값들로 고정하고 싶을 때 Enum 타입을 사용할 수 있습니다. Enum 타입은 정해진 값들을 하나의 클래스에 모아서 관리함으로써 관리가 편하고, 클라이언트는 서버에서 관리되고 있는 Enum 타입만을 사용할 수 있도록 환경이 구성된다면(Select Box, Category 등) 잘못된 데이터를 요청하거나 전달받는 일이 사라집니다. 그런데 Enum이 가져다주는 이점이 있는 만큼, Enum은 신경써서(고민해서) 사용해야 하는 부분도 존재해야 하는데요. 이번 글에서는 이러한 포인트 중 하나인 "Entity 필드가 가지는 Enum값의 목록은 어떻게 가져와야 할까?" 라는 문제에 대해 정리해보려고 합니다. 코드를 보면서 구체적으로 설명을 해보겠습니다. [Communit..

2022.05.20 게시됨

Spring & Springboot

리액트 / 스프링 데이터 JPA 환경에서 커서를 통한 페이지네이션(Pagination) 구현하기

1. 페이지네이션(Pagination) Pagination, also known as paging, is the process of dividing a document into discrete pages, either electronic pages or printed pages. 페이지네이션은 서버에서 데이터를 가져올 때, 전체 데이터를 클라이언트에게 보여지는 단위 혹은 지정된 개수만큼 잘라서 가져오는 방법을 말합니다. 요즘 대부분의 웹/앱 어플리케이션은 무한스크롤을 기반으로 한 페이지네이션을 많이 쓰고 있는데요. 각종 커뮤니티(에브리타임, 블라인드 등)와 SNS(페이스북, 인스타그램)들이 대표적인 예시입니다. 페이지네이션을 사용하는 이유는 명백합니다. 전체 데이터를 한꺼번에 가져오는 오버헤드 대신에 지..

2022.05.18 게시됨

Spring & Springboot

@ControllerAdvice로 Validation 예외 처리하기

0. 들어가면서 아래 링크는 최근에 JPA를 공부하면서 참고하고 있는 Github 레포지토리입니다. GitHub - cheese10yun/spring-jpa-best-practices: spring-jpa best practices :octocat: spring-jpa best practices. Contribute to cheese10yun/spring-jpa-best-practices development by creating an account on GitHub. github.com 이번 포스팅은 위 레포지토리에서 다루고 있는 효과적인 Validation, Exception 처리에 관한 내용을 제 프로젝트에 적용시켜보고, 실제로 코드로 작성해보면서 생각을 정리해보려고 합니다. 1. Validatio..

2022.03.27 게시됨

Spring & Springboot

Springboot와 JWT를 이용한 권한(Authorization) 처리

0. 들어가면서 현재 진행하고 있는 프로젝트에서 회원의 권한 인증 처리 등을 스프링 시큐리티와 JWT을 이용해 처리하고 있습니다. 이전에도 스프링 시큐리티에 관한 간단한 실습을 해봤는데, 이번에는 스프링부트에서 JWT를 이용한 사용자 인증 처리 방법에 대해 정리해보려고 합니다. 먼저 아래와 같이 스프링부트 Initializer를 통해 프로젝트를 생성하겠습니다. 그리고 실습할 코드들의 패키지와 클래스들의 구조는 아래와 같습니다. 이제 JWT의 개념에 대해 공부해보고, 스프링부트에서 JWT 사용을 위한 설정부터 코드 작성까지 살펴보겠습니다. 1. 세션(Session)과 JWT(Json Web Token) 우리가 어떤 서비스를 이용할 때 가장 처음에 하는 행동은 회원가입과 로그인을 하는 것입니다. 하지만 단순..

2022.02.15 게시됨