본문 바로가기

Spring

(40)
아무 관심 없던 @Retention 어노테이션 정리(RetentionPolicy SOURCE vs CLASS vs RUNTIME) @Retention annotation 관심 갖게 된 이유 자바에서 지향하는 방법은 아니지만 필요에 의해서 커스텀 애노테이션(Annotation)을 만들어야 할 때가 있습니다. 보통 예제 샘플 코드를 보면 메타 애노테이션으로 항상 붙어있고 RetentionPolicy=RUNTIME으로 되어습니다. 그렇기 때문에 그럴 때나 보게되는 애노테이션이라 @Retention 은 무시하고 @Target 정도만 확인하고 써왔습니다. 명확히는 @Retention 이라는 애노테이션이 있는지도 모르고 있었습니다. 그러던 중 회사 코드에서 JPA 엔티티(Entity) 클래스의 필드에 롬복(lombok)의 @NonNull 이 쓰인 것을 확인하고 이게 동작하는지가 궁금해지면서 찾아보게 되었습니다. 설명을 읽어보면 @Retenti..
JPA Entity Validation @Column(nullable=false)가 아닌 @NotNull을 써야한다고? JPA Entity Validation JPA Entity Validation. 여러분은 어떻게 유효성 검사를 하고 계신가요? 이번에 인턴사원분들과 코드리뷰를 진행하다가 새롭게 알게 된 사실을 정리하려고 합니다. 저는 보통 유효성 검사를 할 때, @Column(nullable = false) 나 @NotNull 같은거 쓰면 되지 않나?하고 지냈습니다. 조금 찾아보니까 여러 블로그에서 @Column(nullable = false) 를 사용하지말고 @NotNull을 써야한다고 나와있습니다. 그 이유는 대부분 @Column(nullable = false) 의 경우, JPA를 통해 ddl을 자동 생성할 때에만 create 쿼리(Query)에만 들어가고, Entity의 @Column(nullable = false..
JPA 연관 관계 한방에 정리 (단방향/양방향, 연관 관계의 주인, 일대일, 다대일, 일대다, 다대다) JPA에서 가장 중요한 것 JPA에서 가장 중요한 것을 뽑자면, "객체와 관계형 데이터베이스 테이블이 어떻게 매핑되는지를 이해하는 것"이라고 생각합니다. 🏅 왜냐하면 JPA의 목적인 "객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결"이라는 것과 가장 직접적으로 연관되어 있기 때문입니다. Hibernate Document(2. Domain Model)에서도 객체와 테이블 매핑이 전체 스크롤 중, 조금 과장해서 표현하면 절반 수준의 비중인 것을 봐도 객체와 테이블 매핑의 중요성을 짐작할 수 있습니다. 그러나 객체와 테이블 매핑에 대한 내용을 조금 더 구체적으로 나누면 컬럼, 타입, 테이블, ... 등에 대한 1차원적인 매핑과 테이블 간의 연관 관계 매핑으로 나눌 수 있습니다. (개인 의견)..
Transaction 동작 원리, JDBC 기본에 충실한 과정(JPA, Hibernate, Spring's @Transactional) JDBC 트랜잭션에 대한 이해 Transaction 기본 동작 원리를 익히기 위해서 점진적인 접근을 할 것입니다. (두괄식X 미괄식O) 궁극적으로는 @Transactional 이 어떻게 돌아가는지를 알아볼 것이지만, 우선은 그것보다도 중요한 JDBC에서 트랜잭션을 사용하는 방법에 대해서 이해하고 넘어갈 것입니다. Spring의 @Transactional 애노테이션을 쓰거나, JPA(Hibernate), JOOQ 등을 쓰면 사실 라이브러리내에서 관리되므로 아래와 같은 문제는 일어날 일이 없습니다. 앞서 언급한대로 원활한 이해를 위해 아래 JDBC가 트랜잭션을 다루는 코드를 설명하겠습니다. import java.sql.Connection; Connection connection = dataSource.get..
Spring MVC의 핵심 객체 DispatcherServlet에 대한 모든 것(DispatcherServlet이 하는 역할 정리, 동작 프로세스) DispatcherServlet 스프링 MVC는 모든 요청(Request)을 받아 실제 작업은 다른 컴포넌트로 위임하는 DispatcherServlet 을 두어 프론트 컨트롤러 패턴으로 디자인되었습니다. DispatcherServlet 은 Servlet 사양에 맞게 선언되어야 하고 매핑되어야 합니다. 스프링에서는 web.xml 파일에 정의하고, 요새는 스프링과 스프링부트에서는 자바 설정을 사용해서 정의합니다. 결과적으로, DispatcherServlet 은 스프링 설정을 사용하여 위임할 컴포넌트를 찾습니다. (해당 컴포넌트는 Request Mapping, View Resolution, Exception handling, ...의 작업을 합니다.) 아래 코드는 자바 스프링 설정을 이용한 Dispatcher..
Spring Environment 스프링 애플리케이션의 환경에 접근하여 설정 값을 얻어오는 방법(feat. ApplicationContext의 다른 기능, profiles, @Profile) Environment 스프링(Spring)에서 제공하는 인터페이스 중 Environment에 대해서 알아볼 예정이다. Environment 는 말 그대로 스프링 환경이자 설정과 관련된 인터페이스다. (구글에 검색하면 Environment의 동의어로 Setting이 있다.) 어떤 환경 설정에 접근할 수 있는 인터페이스일까? 바로 Profiles 설정과 Property 설정에 접근할 수 있다. 아까부터 포스트의 제목을 포함해서 자꾸 접근한다고 하는데, 그 이유는 설정 값을 변경하는 건 불가능하고 접근해서 값을 가져올 수만 있기 때문이다. (ConfigurableEnvironment 인터페이스로 캐스팅하여 설정 값을 추가할 순 있지만 Environment 인터페이스로는 불가능하다.) ApplicationCon..
Servlet에 대한 개념없이 스프링을 했네요? (급하게 알아보는 스프링 기반 기술 Servlet, Servlet Context, Application Context, ...) 급하게 알아보는 스프링 기반 기술 이름은 아주 거창하게 "스프링 기반 기술" 이라고 지어봤습니다. 배경 최근에 첫 이직을 했습니다. 낯설기도하고 약간의 긴장감과 약간의 두려움이 합쳐져서 우당탕탕(?)하고 있습니다. 그러다가 이제 회사 프로젝트(소스 코드)를 좀 보려고하니, 스프링(Spring)이었습니다. 스프링부트(Springboot)를 써왔어서 큰 거부감은 없었기때문에 볼 만 하겠지 했는데... 음? Servlet, ServletContext, ApplicationContext, ContextLoaderListener, ... 다양한 ~Context의 향연이 펼쳐지며 아차 싶었습니다. 스프링부트에서도 자바 소스(Java Config)로 설정을 했었지만 Servlet으로 자바 소스 설정을 하니까 기본기(..
스프링 부트 애플리케이션에서 초기화 코드를 넣는 3가지 방법 (by 토비님) 스프링 부트에서 초기화 코드를 넣는 3가지 방법 이 포스트는 토비님의 유튜브 강의를 보고 내용을 정리한 포스트입니다. (출처 : https://www.youtube.com/watch?v=f017PD5BIEc) 위의 영상을 보면서 같이 공부하기 어려운 경우(시간이 없거나 집중하기 어려운 경우..?)에 제 글을 가볍게 참고하시면 좋을 것 같습니다. 배경 스프링부트 애플리케이션이 시작할 때 백그라운드에서 굉장히 많은 스프링 빈(Bean)들이 만들어지고 그 외에 스프링 컨테이너가 초기화하는 과정이 진행된다. 여기서 하고자 하는 것은 앞서 언급한 모든 작업을 마치고 나서 "초기화 코드"를 넣어야 하는 경우에 어떤 방법이 있을까에 대한 것이다. 내가 만든 스프링 부트 애플리케이션이 정상적으로 실행이 완료되면, 모니..