다음 테스트 코드에서 @Transactional, @Rollback의 역할을 알아본다. testMember 테스트 메소드 내 memberRepository를 사용하기 위해서 @Transactional 어노테이션이 필요하다. 없으면 다음 에러가 뜬다. Transaction 메소드를 사용하기 위해 필요해 보인다. @Rollback 값은 기본적으로 true다. @Transactional을 통해 DB에 변경사항이 반영이 되지 않고 롤백 된다. 따라서 save를 통한 insert 쿼리를 확인할 수 없다. 이를 확인하기 위해 @Rollback 어노테이션 값을 false로 두어 공부할 때 확인한다. 롤백하지 않으면 위처럼 insert 쿼리를 확인할 수 있다.
Environment ApplicationContext는 EnvironmentCapable 인터페이스를 상속해 environment를 제공한다. EnvirionmentCapable 인터페이스 내용은 다음과 같다. Environment는 애플리케이션의 개발 환경, 테스트 환경, 운영 환경 등을 의미한다. 개발 중에는 H2 DB를 사용하다가 운영 중에는 MySQL을 사용해 환경을 바꿀 수 있다. 스프링의 환경은 Profile과 Property로 제공한다. Profile에 따라 환경이 바뀌고 그에 따라 Property Source가 바뀐다. Properties DB 접속 정보, 서버 포트 정보 등 다양한 정보를 코드 상에 직접 작성하면 배포마다 바꿔야하거나 패스워드 같은 민감한 정
Bean Lifecycle Callbacks Bean 생성 생명주기 콜백 @PostConstruce 애노테이션이 적용된 메소드 호출 Bean이 InitializingBean 인터페이스 구현시 afterPropertiesSet 호출 @Bean 애노테이션이 initMethod에 설정한 메소드 호출 Bean 소멸 생명주기 콜백 @PreDestroy 애노테이션이 적용된 메소드 호출 Bean이 DisposableBean 인터페이스 구현시 destroy 호출 @Bean 애노테이션의 destroyMethod에 설정한 메소드 호출 다음과 같은 코드로 확인할 수 있다. 실행 결과 콜백 메소드 순서는 다음과 같다. 빈을 정의할 때 @Bean 어노테이션의 initMethod 속성을 이용해 초기화 메소드를 지정할 수 있다. 실행 결과는 다음과 같고 init 메소드가 나중에 실행된다.
스프링 공식문서에서 총 6개의 빈 스코프를 볼 수 있다. 기본적으로 싱글톤 스코프를 가진다. 다음과 같이 같은 빈에 대해서 equal 비교를 했을 때 true 결과를 볼 수 있다. 스코프를 임의로 변경할 수 있는데 @Scope 어노테이션을 이용해 바꿀 수 있다. 아래와 같이 빈 클래스 파일에서 PROTOTYPE 스코프로 바꿀 수 있다. 스코프를 변경 후 equal 비교를 했을 때 다른 객체임을 확인할 수 있다. 는 A 빈을 생성하기위해 B를 주입해줘야하기 때문에 B를 찾는다. 근데 B를 생성하려 하니 A를 주입하기위해 A를 찾게되면서 무한 반복이 생긴다.
IoC는 다양한 방법으로 만들 수 있다. 전략 패턴, 서비스 로케이터 패턴, 팩토리 패턴, 의존관계 주입 패턴들이 있다. 지금까지 쓴 생성자를 통해서 객체를 주입받는 패턴을 생성자 주입 패턴(DI)이라고 부른다. 스프링은 생성자 주입을 권장한다. 애플리케이션 구성 요소를 불변 객체로 구현하고 필요한 종속성이 null이 되지 않도록 보장한다. 생성자의 파라미터는 항상 초기화된 상태로 클라이언트 코드로 반환된다. [https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-setter-injection](https://docs.spring.io/spring-framework/docs/current/refe
IoC 컨테이너는 객체에 대한 생성과 조합이 가능하게하는 프레임워크다. 스프링에서는 IoC 컨테이너를 ApplicationContext인터페이스로 제공한다. ApplicationContext는 BeanFactory를 상속한다. 객체에 대한 생성, 조합, 의존관계 설정 등을 제어하는 IoC 기본기능은 BeanFactory에서 담당한다. Bean은 IoC 컨테이너에 의해 관리되는 객체다. 할 오브젝트를 주입 혹은 인젝션(프로퍼티에 설정) 한다는 것이다. DI를 구현하는 컨테이너는 클래스의 인스턴스화 등의 생명 주기 관리 기능이 있는 경우가 많다. 다음은 인터페이스를 이용하지 않는 단순한 웹 애플리케이션이다. ProductSampleRun이 ProductService를 new 하고 ProductService가 ProductDao를 new한 다음 각각의 인스턴스를
Spring MVC Spring MVC 란 Spring 프레임워크에서 제공하는 웹 모듈이다. MVC 는 Model-View-Controller 의 약자로, 기본 시스템 모듈을 MVC 로 나누어 구현되어있다. Model 은 '데이터' 디자인을 담당한다. ex. 상품 목록, 주문 내역 등 View 는 '실제로 렌더링되어 보이는 페이지' 를 담당한다. ex. thymeleaf 파일들이 여기에 해당된다. Controller 는 사용자의 요청을 받고, 응답을 주는 로직을 담당한다. ex. GET 등의 uri 매핑이 여기에 해당된다. Spring MVC 모듈을 사용하여, 백엔드 프로그래밍의 기본 프레임워크를 잡는다. Web 서버에 특화되어 만들어진 모듈이라, 개발자가 해야할 영역을 더 적게 만들어준다. 즉 기존에 Spring 보다 더 깔끔하고 간편하게 개발
IOC란 IoC란 Inversion of Control의 약자로 해석하자면 제어의 역전이다. 제어의 역전은 제어권이 뒤 바뀌었다는 뜻이다. 이말은 기존의 제어방식을 뒤집었다는 말이 된다. 그렇다면 기존의 방식은 어떠했는가 살펴보자. 자바가 등장하고 자바 기반의 어플리케이션이 개발되던 초기에는 자바 객체를 생성하고 객체간의 의존관계를 연결하는 등의 제어권을 개발자가 직접 가지고 있었다고 한다. 그러나 서블릿, EJB가 등장하면서 개발자가 독점적으로 가지고 있던 제어권이 서블릿과 EJB를 관리하는 외부의 컨테이너로 넘어갔다. 객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 IoC, 제어의 역전이라 하는것이다. IOC 컨테이너 모든 작업을 사용하는 쪽에서 제어하게 되면서 IoC컨테이너에서 제어하게 된다. 기본적으로 컨테이너는 객체를 생성하고 객체간의 의존성을 이어주는 역할을 한다. BeanFactory BeanFa
의존성 주입은 프로그램 디자인이 결합도를 느슨하게 한다. 의존성 주입은 의존관계 역전 원칙과 단일 책임 원칙을 따르도록 한다. 클라이언트의 객체 생성에 대한 의존성을 클라이언트의 행위로부터 분리하는 것이다. 의존성 주입은 다음과 같은 문제를 해결한다. 어떻게 애플리케이션이나 클래스가 객체의 생성 방식과 독립적일 수 있는가? 어떻게 객체의 생성 방식을 분리된 구성 파일에서 지정할 수 있는가? 어떻게 애플리케이션이 다른 구성을 지원할 수 있는가? 객체를 필요로하는 클래스 내에서 직접 객체를 생성하는 것은 클래스를 특정 객체에 커밋하는 것이다. 이후에 클래스로부터 독립적으로(클래스의 수정 없이) 인스턴스의 생성을 변경하는 것이 불가능하기 때문에 유연하지 못하다. 이는 다른 객체를 필요로하는 경우 클래스를 재사용할 수 없게한다. 또한 실제 객체를 모의 객체로 대체할 수 없기 때문에 클래스를 테스트하기 힘들게한다. DI 등장 예시 을 지원한다. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다. 스프링은 의존성 주입(DI : Dependency Injection)을 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented
스프링 웹 계층 스프링 프로젝트를 할 때 다음과 같이 계층을 나눌 수 있다. 스프링 계층은 크게 3개로 나눌 수 있다 Presentation Layer Business Layer Data Access Layer 프레젠테이션 계층 브라우저상의 웹 클라이언트의 요청 및 응답을 처리한다. Service Layer, Data Access Layer에서 발생하는 Exception 처리 @Controller 클래스가 이 계층에 속한다. Controller 컨트롤러는 사용자의 요청을 처리한 후 지정된 뷰에 모델 객체를 넘겨주는 역할을 한다. 사용자의 요청이 진입하는 지점이며 요청에 따라 어떤 처리를 할 지 결정을 해 Service에 넘겨준다. 서비스 계층
스프링 프레임워크에서는 다음과 같은 디자인 패턴을 사용한다. 싱글톤 패턴 팩토리 메소드 패턴 프록시 패턴 템플릿 패턴 싱글톤 패턴 싱글톤 패턴은 객체에 대해 하나의 인스턴스만 존재하는 것을 보장하는 기법이다. 공유 자원을 관리하거나 로깅과 같은 횡단 서비스를 제공할 때 유용하다. 싱글톤 빈(bean) Spring IOC 컨테이너 당 하나의 객체로 싱글톤을 제한한다. 즉 Spring은 애플리케이션 컨텍스트 당 각 타입에 대해 하나의 빈만 생성한다. 애플리케이션은 두 개 이상의 스프링 컨테이너를 가질 수 있기 때문에 일반적인 싱글톤과는 다르다. 여러 컨테이너가 있는 경우 여러 객체가 애플리케이션에 존재할 수 있다. 팩토리 메소드 패턴 팩토리 메