본문 바로가기

분류 전체보기

(21)
@MappedSuperclass 와 임베디드 타입 @MappedSuperclass 와 임베디드 타입은 여러 엔티티에서 공통으로 사용되는 필드를 별도의 클래스로 분리하여 부모 엔티티에 적용하는 방식이다. 하지만 @MappedSuperclass 의 경우 상속을 받아 적용하고, 임베디드 타입의 경우 위임을 받아 적용하므로 서로 다른 상황에서 쓰일 수 있다. @MappedSuperclass 사용 예시 DataInfo.java @MappedSuperclass public abstract class DataInfo { private String createdBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate; } Membe..
AOP 용어 AOP 용어 정리 조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. 포인트컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능 타켓(Target) 어드바이스를 받는 객체(핵심 기능이 있는 메서드), 포인트컷으로 결정 어드바이스(Advice) 부가 기능 특정 조인 ..
요청 파라미터 검증 요청 파라미터의 검증은 1차적으로 클라이언트 영역에서 하지만 데이터를 다루는 서버 영역에서도 반드시 체크가 필요하다. 스프링을 사용하면 보통은 Validator와 BeanValidator 두가지를 통해 검증한다. 두가지의 사용 용도는 경우의 따라 달라지기도 하지만 보통은 요청 파라미터만을 검증할 때는 BeanValidator를 적용하고, 파라미터를 이용해 계산을 하거나 별도의 조건이 있다면 Validator 를 사용한다. BeanValidator BeanValidator 는 데이터를 담는 객체의 필드마다 검증하고 싶은 애노테이션을 붙여 적용하는 방식이다. 애노테이션만 적용하면 되므로 if문을 사용해 코드가 지저분해지지도 않는다. BeanValidator 는 널을 허용하지 않는 것부터 숫자 제한, 이메..
HandlerExceptionResolver - API 예외처리 RESTful API를 개발할 때 고려해야 할 사항 중 Response Status를 잘 남겨야 하는 사항이 있다. 일반적으로 성공한 요청에 대해서는 적절한 상태를 나타내지만 예외가 발생하면 그렇지 않은 경우가 있다. 따라서 스프링 MVC는 HandlerExceptionResolver 인터페이스를 제공하는데 상속받아 직접 구현하거나 애너테이션을 적용해 예외를 해결하면서 적절한 Response Status를 지정해줄 수 있다. HandlerExceptionResolver 호출 시점 HandlerExceptionResolver는 이름에서 유추할 수 있듯이 Handler 밖으로 예외가 던져진 경우 호출되어 처리한다. 따라서 예외가 발생해도 서블릿 컨테이너까지 예외가 전달되지 않고, 스프링 MVC에서 예외 처리..
트랜잭션 격리성 데이터베이스 트랜잭션은 4가지 특성을 가지고 있다. 4가지 중 3가지에 대해서는 글로만 읽더라도 쉽게 이해가 되었는데 격리성에 대해서는 이해하기 어려워 이를 정리하고자 한다. 격리성(Isolation) 여러 트랜잭션이 동일한 데이터를 다루다 보면 이상 현상이 발생할 수 있다. 예를 들어 트랜잭션-1은 데이터 A의 값을 50에서 10으로 변경하고, 트랜잭션-2는 A의 값을 50에서 100으로 변경한다고 가정해보자. 1. 트랜잭션-1 : A의 값 조회 (결과 : A = 50) 2. 트랜잭션-2 : A의 값 조회 (결과 : A = 50) 3. 트랜잭션-1 : A의 값 변경 (결과 : A = 10) 4. 트랜잭션-1 : 커밋 5. 트랜잭션-2 : A의 값 변경 (결과 : A = 100) 6. 트랜잭션-2 : 커..
JUnit5 Extension 정리 Extension Extension은 테스트 실행 전후로 무언가 처리를 하고 싶을 때 사용한다. 위와 같이 언제 실행될 것인지 구체적으로 정할 수 있으며 Interface로 구성되어 implements를 선언 후 메서드를 작성해주어야 한다. 주요 인터페이스 AfterAllCallback : 모든 테스트 종료 후 실행 (가장 나중에 실행된다.) AfterEachCallback : @AfterEach 적용된 메서드 종료 후 실행 AfterTestExecutionCallback : 각 테스트가 종료 후 실행 BeforeAllCallback - @BeforeAll 적용된 메서드 전에 실행(가장 먼저 실행된다.) BeforeEachCallback - @BeforeEach 적용된 메서드 종료 후 실행 BeforeT..
스프링AOP - 실무 주의사항 프록시 방식의 AOP 한계 스프링은 프록시 방식의 AOP를 사용한다. 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체를 호출한다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다. 프록시 방식의 AOP는 메서드 내부 호출에 프록시를 적용할 수 없다. 아래 코드로 테스트를 해보자. CallServiceV0.java package hello.aop.internalcall; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Slf4j @..