Java/자바 잡지식
Filter, Interceptor, AOP 알아보기
개요 스프링의 HandlerInterceptor, Filter, AOP 는 비슷한 문제를 해결하려 쓰인다. 공통점은 무엇이며 차이점은 무엇일까? Interceptor, Filter, AOP 의 공통 목적을 알아보자 공통 관심사를 처리하는 데에 있다. (Factoring out common repetitive code) Interceptor 에 대한 설명 포스팅 Filter 에 대한 설명 포스팅 Interceptor 와 AOP 의 차이는? 일단 Interceptor 와 AOP 둘 다 스프링에서 자체적으로 기술을 제공하며, 공통 관심사 코드를 뽑아내 적용시키기 위해 나왔다. (물론 AOP 는 스프링이 원조는 아니고, 스프링에서 AOP 를 흉내낸 기술을 제공할 뿐이다.) AOP 는 메서드 동작의 전 후 과정에..
스프링의 Interceptor 란 무엇일까? [공식문서 번역]
인터셉터(HandlerInterceptor) 란? 커스터마이즈된 핸들러 실행 체인을 허가하는 워크플로우 인터페이스이다. 애플리케이션은 이미 존재하는 인터셉터 혹은 커스텀 인터셉터를 특정한 그룹에 추가할 수 있다. 공통적인 전처리 행위를 추가하기 위해 각 핸들러 구현을 수정할 필요는 없다. (다만 새롭게 추가하면 된다.) HandlerInterceptor는 적절한 HandlerAdapter가 핸들러를 수행하기 전에 호출된다. 전처리 관점에서 꽤 많은 범위에 사용될 수 있는 매커니즘이다. 이를테면 권한 체크, 언어 설정, 테마 설정 등 공통 핸들러 행위가 있다. 반복되는 핸들러 코드를 뽑아내는 것(factoring out repetitive handler code)이 주 목적이다. 비동기 처리 시나리오에서는..
자바 EE 필터 (Filter) 란?
필터 (Filter) 란? J2EE 표준 스펙 기능이다. 스프링에서 활용할 때 Dispatcher Servlet 으로 요청이 전달되기 전에 요청에 대한 부가 로직을 작성할 수 있게 해준다. 스프링 컨텍스트 밖에 존재하므로, 스프링 범위 밖에서 처리된다. 설명 resource(서블릿 혹은 정적 컨텐츠) 를 요청하는 request 혹은 resource 를 반환하는 response 혹은 둘 다 에 관한 필터링 작업을 수행하는 오브젝트이다. doFilter() 메서드에서 필터링을 수행한다. 모든 필터는 초기화 파라미터를 얻을 수 있는 FilterConfig 오브젝트에 접근 권한을 가지고 있다. 그리고 ServletContext 에 접근할 수 있는 참조를 얻을 수 있다. 이를 이용해 작업을 필터링하는 리소스를 로..
스프링의 @Value 애노테이션이란?
@Value 개요 스프링에서 제공하는 애노테이션이다. 스프링에서 보통 프로퍼티에 정의된 값을 코드상으로 가져오고 싶을 때 쓴다. 스프링의 BeanPostProcessor 를 통해 이루어진다. 공식문서 번역 애노테이트된 요소에 대한 기본 값 표현을 나타내는 애노테이션이다. 필드 혹은 메서드/생성자 파라미터에 사용된다. 주로 표현식을 이용하거나 프로퍼티를 이용한 의존성 주입에 사용된다. 또한, 스프링 MVC 에서 핸들러 메서드 인자의 동적인 값 분해(resolution)도 지원된다. 일반적인 use case 는 SpEL (Spring Express Language) 표현식 스타일로 #{systemProperties.myProb} 처럼 값을 주입하는 것이다. 혹은 ${my.app.myProp} 스타일 프로퍼티..
DTO (Data Transfer Object) 란?
DTO 패턴이란? DTO Pattern 이란, Data Transfer Object Pattern 를 줄여 말한 것이다. DTO 란? DTO 는 Data Transfer Object 라는 이름처럼 단순히 프로세스간 데이터를 전송하기 위한 오브젝트를 말한다. 메서드 호출을 줄이는 것이 주 목적이다. DTO 와 다른 오브젝트의 차이 흔히 쓰는 Business Object 나 Data Access Object 와 달리 DTO 는 아무런 로직을 갖지 않는다. 그저 데이터를 잠시 담아서 실어나르는 역할만 수행할 뿐이다. JPA 에서 DTO 를 쓰게 되는 이유 마틴 파울러의 글을 인용하자면, 도메인 모델과 프레젠테이션 계층에서의 미스매치가 있을 때는 DTO 가 유용하다고 한다. JPA 에서 사용하는 도메인 모델을 ..
Java EE 빈 검증 (Bean Validation)
Bean Validation 소개 유저에게 받은 입력 값을 검증하는 것은 애플리케이션에서 중요하며 자주 쓰인다. Validation 은 이러한 검증을 책임진다. Java Bean Validation 은 오브젝트, 오브젝트 멤버, 오브젝트 메서드, 오브젝트 생성자 에 대한 검증을 제공한다. Bean Validation 은 Java EE 컨테이너와 통합하여, 개발자가 쉽게 검증 제약조건을 정의할 수 있도록 도와준다. Bean Validation 은 어떤 기술인가? Bean Validation 은 Java EE 7 platform 의 일부이다. JSR 380 이라는 API 구현 명세를 따른다. 자바 EE 가 무엇인지 잘 모른다면, 자바 EE 란 무엇인가 를 한번쯤 읽어보는 것이 좋다. 여기서 말하는 Bean ..
Java EE GenerationType 정리
GenerationType Enum 개요 기본키 생성 전략의 타입을 정의한다. Enum 상수 요약 AUTO (기본 값): persistence provider 가 특정한 데이터베이스에 따라 적절한 전략을 선택해야 함을 나타낸다. Dialect 에 따라 자동 지정된다고 할 수 있다. AUTO 생성 전략은 데이터베이스에 리소스가 있다고 기대할 수도 있고 혹은 새로운 리소스를 만들어내려 시도할 수도 있다. 스키마 생성을 지원하지 않거나 스키마 리소스를 런타임에 생성할 수 없는 때에 어떻게 리소스를 생성하는지 벤더가 문서를 제공할 수도 있다. IDENTITY: persistence provider 가 데이터베이스 identity 컬럼을 사용하여 엔티티에 반드시 기본 키를 할당해야 함을 나타낸다. 보통 데이터베이..
Java EE @GeneratedValue 공식문서 번역 정리
@GeneratedValue 애노테이션 개요 Java EE 표준에 속하는 Java Persistence 에 있는 애노테이션이다. 기본키 값에 대한 생성 전략 명세를 위해 제공된다. 엔티티 혹은 mapped superclass의 기본 키 프로퍼티 혹은 필드에 @Id 애노테이션과 함께 적용된다. @GeneratedValue 애노테이션의 사용은 오직 간단한 기본 키에만 필요로 된다. 'derived primary key' 를 지원하지 않는다. ex) 주민번호와 같은 인위적인 키 // Example 1: @Id @GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ") @Column(name="CUST_ID") public Long getId() { re..
Lombok 을 사용할 때 주의해야 하는 점들 정리
Lombok을 사용하며 주의할 것들 정리 Lombok 은 편리한 기능을 많이 제공하지만, 때때로는 그 편리함이 독이 될 수 있다. @AllArgsConstructor, @RequiredArgsConstructor 주의 얼핏 보기엔 단순히 생성자만 만들어주는 것 같은데, 어떻게 버그를 만들 수 있을까? 버그 시나리오 @AllArgsConstructor @RequiredArgsConstructor @ToString public class TestUser { public String id; public String password; } 위와 같은 롬복 떡칠한 TestUser 가 있을 때, 일단 사용하기는 편리하다. 간단한 테스트 코드를 만들어서 테스트도 해본다. @Test void test() { TestUs..
스프링 @Bean 애노테이션 정리
@Bean 애노테이션 설명 스프링 컨테이너에 의해 관리되는 빈을 생성하는 메서드임을 나타낸다. 스프링 XML 에서 태그를 통해 등록하는 방식을 자바 코드 방식으로 변형한 것으로 둘의 역할은 같다. @Bean public MyBean myBean() { // instantiate and configure MyBean obj return obj; } 적용 범위 @Target(value={METHOD,ANNOTATION_TYPE}) @Retention(value=RUNTIME) @Documented public @interface Bean { } 메서드나 다른 애너테이션 타입에 붙일 수 있다. 빈 이름 기본 전략으로는 메서드의 이름을 그대로 따르게 된다. 그러나 name() 애트리뷰트를 통해 변경할 수도 있다..
스프링 @Configuration 애노테이션 정리
@Configuration 애노테이션 적용 범위 @Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Configuration 클래스에 해당하는 타입에 붙일 수 있다. 설명 클래스에 적용되어 빈을 생성하는 클래스임을 표기한다. 이 클래스는 한개 혹은 그 이상의 @Bean 메서드를 선언함을 표기한다. 런타임 중에 Bean Definition 을 생성하고 해당 빈들에 대한 서비스 요청을 생성한다. 이는 보통 스프링 컨테이너에 의해 처리된다. @Configuration public class AppConfig { @Bean public MyBean myBean() { // instantiate, configu..
자바 @Retention 애노테이션 정리
@Retention 애노테이션이란? 애노테이션의 메타 정보가 언제 버려질지에 대한 타이밍을 설정한다. SOURCE, CLASS, RUNTIME 중 하나를 선택할 수 있다. RetentionPolicy.SOURCE 소스코드인 구간에만 유지되고 클래스 파일이 되는 컴파일 과정에서 애노테이션 정보는 사라진다. RetentionPolicy.CLASS .class 파일에 기록되고, 런타임에 버려진다. 클래스 파일까지만 유지된다. 자바에서의 기본 retention 이다. 질문: RetentionPolicy.CLASS 는 왜 필요한가? 사실 왜 필요한가 싶을 수 있다. '소스코드까지 유지될거면 SOURCE 를 사용하고, 런타임까지 유지될거면 RUNTIME 을 사용하면 되지. 애매하게 CLASS 는 어디다가 쓰..