CEOS back-end 21st spring tutorial project
시작하기 전 알면 좋을 개념
- 프레임워크 vs 라이브러리
- 공통점: 이미 만들어진 것을 개발자가 사용한다
- 차이점: 프로그램의 제어권 여부(프레임워크 -> 코드 -> 라이브러리)
- 컨테이너란?
- 어떤 환경에서든 코드를 실행할 수 있도록, 코드 실행에 필요한 모든 요소를 담아둔 소프트웨어 패키지. 코드는 물론 언어, 라이브러리 같이 종속적인 모든 항목을 포함한다.
기업에서 자바 어플리케이션을 만들기 위해 사용할 수 있을 정도의 기술을 포함하고 있는 프레임워크.
- 자바 플랫폼
- 경량(과도한 엔지니어링 없이 단순한 환경에서 사용 가능)
기존에는 다소 복잡했던 스프링 프레임워크의 의존성 설정이나 버전 관리, 빈 등록, 배포 등을 더 쉽게 할 수 있도록 도와주는 프레임워크가 Spring Boot 이다.
- IoC/DI
- 제어의 역전: 스프링 컨테이너가 빈으로 등록된 객체의 생명 주기를 관리한다.
- 의존성 주입: 어떤 객체를 이용해야 할 때, 내부에서 선언, 생성하는 것이 아니라 스프링이 외부에서 주입해줌.
- AOP
- 어떤 코드들이 사용하는 공통적인 로직이 있을 때 이 코드들을 모아서 필요한 곳에 공통으로 적용 가능
- PSA
- 여러 서비스를 묶어서 하나로 추상화하는 것. 이 때문에 내부 전략이 바뀌더라도 이를 신경쓰지 않아도 된다.
- 예를 들어
@Transactional어노테이션을 사용할 때 데이터베이스와 연결 시 JDBC, JPA 중 어느것을 사용하든 해당 어노테이션의 내부적 구현을 바꾸지 않고 사용 가능하다. 사용자의 선언에 따라 의존성을 주입받기 때문이다.
- POJO
- Java 스펙에 기술되지 않은 다른 기술을 사용하지 않고 순수한 자바 코드만으로 작성한 오브젝트.
- 이를 위해 위의 IoC/Di, AOP 등의 기술을 지원한다.
앞서 일반적인 컨테이너에 대해 설명해두었는데, 스프링 컨테이너에 대해 더 자세히 알아보자.
스프링 컨테이너란 ApplicationContext라는 인터페이스를 일컫는다. 즉, 자바 코드 내에서 객체로 선언하고 구현체를 생성할 수 있다.
이 인터페이스의 구현체를 생성할때 빈들 간의 관계를 정의한 config 파일(xml 등)을 넘겨주는데, 이곳에 정의된 메타 정보(데이터의 스펙)를 읽으면서 '스프링 컨테이너'가 된다.
context 객체는 xml 파일을 읽으면서, 파일 내 정의된 객체를 생성하고 관리하게 된다. getBean 메소드를 통해 객체를 전달할 수 있다.
이 때 xml 파일에 정의되어 스프링 컨테이너가 관리하게 된 자바 객체를 빈 이라고 한다.
스프링컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료
이 때, 생성자로 의존성을 주입 받는다면 객체 생성과 동시 의존 관계가 주입된다.
그렇지 않고 setter 등으로 의존 관계를 주입 받는다면 객체를 먼저 생성하고, 그 후에 의존성을 주입한다.
- 초기화 콜백
코드 자체의 기능을 변경하는 것이 아니라, 해당 코드의 메타 정보에 추가적인 정보를 제공하면서 런타임에 특정 기능을 실행하도록 알려주는 일종의 메타 데이터이다.
각 어노테이션은 또 다른 어노테이션을 포함하고 있을 수 있고, 어노테이션을 직접 만들 수도 있다.
매우 많다. @Controller, @Service, @Bean 등의 어노테이션이 있다. 각 어노테이션들은 다른 어노테이션을 포함하고 있을 수도 있는데, @Component 어노테이션을 포함하고 있는 어노테이션들은 빈으로 등록될 수 있다.
@ComponentScan어노테이션은 @Component 어노테이션이 포함되어있는 어노테이션을 자동으로 스캔하여 해당 객체를 빈으로 등록한다.
이 전에는 xml 파일에 패키지 경로를 입력하여 정의했지만 어노테이션을 사용하면 자바 파일에서 스캔할 수 있다.
격리된 환경에서 필요한 부분만 모의 객체를 모아서 빠르고 효율적으로 테스트를 진행한다. 서비스, 레포지토리, 도메인, 또는 코드 별 테스트를 작성할 수 있다.
실제 테스트하려는 클래스와 의존 관계에 있는 다른 객체들은 가짜 객체로 대체하여 진행한다.
어플리케이션의 전체 컨텍스트를 가져와 실제 동작 환경과 유사한 환경에서 테스트를 진행한다.
시스템 바깥의 다른 외부 시스템과의 연동 상태도 점검 가능하다.