모르지 않다는 것은 아는것과 다르다.

Spring 39

빈 생명주기와 콜백

빈 생명주기와 콜백 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링 빈은 간단하게 다음과 같은 라이프사이클을 가진다. 객체 생성 -> 의존관계 주입 스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다. 개발자가 의존관계 주입이 모두 완료된 시점을 어떻게 알 수 있을까? 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 스프링은 스프링 컨테..

Spring 2022.02.26

Transactional Propagation

Transaction Propagation 종류 REQUIRED (default) 기존에 시작된 트랜잭션이 있으면 유효성을 검사해서 문제가 있다면 Exception 을 던지고 문제가 없으면 기존의 시작된 트랜잭션을 사용한다. 만약 기존에 시작된 트랜잭션이 없다면? -> 새로운 트랜잭션을 생성한다. 실무에서는 거의 이 옵션을 주로 사용한다. REQUIRES_NEW 부모 트랜잭션이 있더라도 항상 새로운 트랜잭션을 시작한다. 이미 진행중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다. 그리고 자식 트랜잭션이 완료(커밋 혹은 롤백)되면 보류되었던 트랜잭션이 다시 활성화된다. SUPPORTS 기존에 시작된 트랜잭션이 있으면 유효성을 검사해서 문제가 있다면 Exception 을 던지고 문제가 없으면 기존의 시작된 ..

Spring 2022.02.26

SpringMVC

개요 SpringMVC 패턴을 이해하기 위해서 기본적으로 알아야 될 지식들을 정리하고자 한다. 웹 서버(Web Server) HTTP 기반으로 동작한다. 정적 리소스를 제공한다. 정적(파일)에는 HTML, CSS, JS, 이미지, 영상등이 있다. 웹 서버의 예로는 NGINX, APACHE 등이 있다. 웹 애플리케이션 서버(WAS - Web Application Server) HTTP 기반으로 동작한다. 프로그램 코드를 실행해서 애플리케이션 로직을 수행한다. 동적 HTML 를 처리한다. HTTP API(JSON) 등을 핸들링할 수 있다. 서블릿, JSP, 스프링 MVC 가 WAS에서 실행된다. 웹 서버가 하는 기능 대부분을 포함하고있다. 예로는 Tomcat, Undertow, Jetty 등이 있다. WAS..

Spring 2022.02.26

BindingResult

BindingResult BindingResult는 검증 오류가 발생할 경우 오류 내용을 보관하는 스프링 프레임워크에서 제공하는 객체다. 스프링이 제공하는 검증 오류를 보관하는 객체이다. 검증 오류가 발생하면 여기에 보관하면 된다. BindingResult 파라미터의 위치는 @ModelAttribute 파라미터 다음에 와야한다. BindingResult가 없으면 @ModelAttribute 에 데이터 바인딩 시 오류가 발생해도 컨트롤러가 호출된다. 원래 같았으면 400에러로 오류 페이지로 넘어가야 되지만, BindingResult를 넣어주면 오류에 대한 결과가 BindingResult 객체에 담기고 컨트롤러가 호출된다. BindingResult에 검증 오류를 적용하는 3가지 방법 @ModelAttribu..

Spring 2022.02.26

Bean Validation (BindingResult 개념을 먼저 숙지 해야된다.)

Bean Validation (BindingResult 개념을 먼저 숙지 해야된다.) Bean Validation 특정 피리드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직일 확률이 크다. 그렇기 때문에 이런 검증 로직을 모든 프로세스에 적용할 수 있게 공동화하고, 표준화 한 것이 Bean Validation이다. Bean Validation을 잘 활용하면, 애노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있다. implementation 'org.springframework.boot:spring-boot-starter-validation' 디펜던시를 추가해줘야한다. 예시로는 아래와 같은 검증 애노테이션이 있다. @NotBlank : 빈값 + ..

Spring 2022.02.26

ApplicationRunner,CommandLineRunner

ApplicationRunner,CommandLineRunner 개요 스프링 부트 애플리케이션이 구동될 때마다 앞서 실행시키고 싶은 코드가 있다면, ApplicationRenner, CommandLineRunner 를 이용해서 처리할 수 있다. ApplicationRunner 코드 예시는 아래와 같다. @Component public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner start!"); } } 위와 같이 설정하면 구동 시점에 run 메소드의 코드..

Spring 2022.02.26

API 예외처리

API 예외처리가 필요한 이유 HTML 페이지의 경우 지금까지 설명했던 것 처럼 4xx, 5xx와 같은 오류 페이지만 있으면 대부분의 문제를 해결할 수 있다. API의 경우에는 생각할 내용이 더 많다. API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다. API 예외 처리 - 스프링 부트 기본 오류 처리 BasicErrorController 를 통해서 프링 부트가 제공하는 기본 오류 방식을 사용할 수 있다. 구현은 아래와 같이 되어있다. @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResp..

Spring 2022.02.26

Spring AOP

AOP 란? AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 흩어진 관심사 (Crosscutting Concerns)라 부른다. 아래와 같이 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지다. 프록시 패턴 위에서 보듯 Client는 이 interface 타입으로 Proxy 객체를 사용하게 된다. Proxy 객체는 기존의 타겟 객체(Real Subject)를 참조하고 있다. Proxy 객체와..

Spring 2022.02.26

@Valid, @Validated

@Valid, @Validated 개요 평소 validation 처리할때 자주 사용했던, @Valid, @Validated 에 대해서 자세히 알아보고자한다. @Valid JSR-303 표준 스펙이다. javax.validation.Vaild 필드에 달린 제약조건 어노테이션을 참고해 검증할때 주로 사용된다. 빈 검증기(Bean Validator)를 이용해서 검증하는 애노테이션이다. Spring에서는 LocalValidatorFactoryBean을 이용해 JSR 표준의 검증 기능을 사용할 수 있다. -> LocalValidatorFactoryBean 는 JSR-303의 검증 기능을 이용할 수 있도록 해주는 일종의 어댑터에 해당한다. @Valid 를 사용하려면, LocalValidatorFactoryBean을..

Spring 2022.02.26