티스토리 뷰
1.1 스프링의 동작 구조
스프링 동작 이해를 위한 기본 개념 용어
- 스프링 애플리케이션 컨텍스트(spring application context) : 애플리케이션의 컴포넌트들을 생성하고 관리하는 컨테이너
컴포넌트 또는 빈들은 컨테이너 내부에서 서로 연결되어 있어 완전한 애플리케이션을 만든다
- 의존성 주입(Dependency Injection) 방식: 빈들의 상호 연결은 의존성 주입 패턴을 기반으로 수행한다
하나의 빈에서 외부의 빈을 필요로 할때 직접 가져다쓰거나 만들어 쓰는 것이 아닌 외부(컨테이너)에게 필요한 빈을 요청하고 외부(컨테이너)는 필요한 빈을 주입시켜주는 방식이다
예전의 스프링 컨텍스트의 빈 관리는 XML 파일을 통해 이루어졌다
<bean id="inventoryService"
class="com.example.InventoryService" />
<bean id="productService"
clas="com.example.productService" />
<constructor-arg ref="inventoryService" />
</bean>
그러나 최신 버전의 스프링에서는 자바 기반의 구성이 더 많이 사용된다
@Configuration
public class ServiceConfiguration {
@Bean
public InventoryService inventoryService(){
return new InventoryService();}
@Bean
public ProductiveService productiveService(){
return new ProductiveService(inventoryService());}
}
- @Configuration : 해당 클래스가 스프링 애플리케이션 컨텍스트에서 관리하는 빈들을 구성하고 있는 클래스임을 스프링에게 알려주는 역할을 한다 클래스의 메소드들은 @Bean 어노테이션이 붙어있어야 한다
- @Bean : 해당 메소드의 반환 객체를 스프링 애플리케이션 컨텍스트가 관리하는 빈으로 등록되어야 함을 알려주는 역할을 한다
스프링의 자동-구성 기능 (autoconfiguration)
별도의 XML 구성이나 자바 구성 없이 스프링이 자동으로 컴포넌트들을 구성하는 자동 구성 기능이 있다.
자동 연결(autowiring)과 컴포넌트 검색(component scanning)이라는 스프링 기법으로 실행된다
이러한 자동구성 기능은 스프링 부트가 생겨나면서 더욱 향상되었다
1.2 스프링부트 프로젝트의 생성과 메인 클래스
Initializer을 이용하여 필요한 라이브러리 선택 후 프로젝트 생성 (Maven, Jar)
메인 클래스
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringInActionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringInActionApplication.class, args);
}
}
- SpringBootApplication:아래 세개의 어노테이션의 결합된 형태-하위 클래스들을 탐색하며 빈으로 주입시키는 역할
- @SpringBootConfiguration : @Configuration의 특화된 형태
- @EnableAutoConfiguration : 자동-구성 활성화
- @ComponentScan : 컴포넌트 검색 활성화
- SpringApplication.run : 스프링 애플리케이션 컨텍스트를 생성하는 메소드
컨트롤러 테스트
@RunWith(SpringRunner.class)
@WebMvcTest(TestController.class)
public class TestControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testTestControllerSuccess() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("home"))
.andExpect(content().string(containsString("Welcome to...")));
}
}
- Junit4를 사용하면 @RunWith으로 스프링부트와 테스트를 연동하여야한다
- web layer 테스트를 위하여 @WebMvcTest를 사용
- 스프링은 MVC 테스트를 위한 Mock(모의 메커니즘) 객체를 지원한다 이를 주입받아 테스트를 진행한다
1.3 DevTools 란
개발자에게 개발 시점에 사용하면 편리한 도구들을 제공해주는 라이브러리
- 자동으로 애플리케이션을 다시 시작시킨다
- DevTools를 사용하게 되면 애플리케이션이 JVM에서 두개의 클래스 로더에 의해 로드된다. 하나는 자바코드, 속성 파일, 프로젝트의 src/main 경로에 있는 모든 것과 함께 로드된다. 다른 하나는 자주 변경되지 않는 의존성 라이브러리와 함께 로드된다. 변경이 감지되는 경우 자바코드를 포함하고 있는 클래스 로더만이 다시 로드되므로써 애플리케이션이 시작하는데 걸리는 시간을 조금이나마 단축해준다
- 의존성 라이브러리를 추가 변경 삭제 시에는 애플리케이션을 재시작하여야 한다
- 자동으로 브라우저를 새로고침하고 템플릿 캐시를 비활성화한다
- thymeleaf와 freemarker 등과 같은 뷰 템플릿을 사용 할 때는 파싱 결과를 캐시에 저장하고 사용되기 때문에 애플리케이션이 실행중일 때 코드를 수정하여도 브라우저에는 변경사항이 보여지지않고 애플리케이션을 재시작하여야만 볼 수 있다. DevTools는 모든 템플릿 캐싱을 자동으로 비활성화하여 템플릿을 변경하고 브라우저를 새로고침하게 되면 자동으로 변경된 템플릿이 적용된다.
- 새로고침 버튼 클릭없이 자동으로 변경되는 것을 원한다면 브라우저에 LiveReload를 설치하면 된다 변경사항을 자동으로 감지하여 새로고침 없이 변경된 템플릿을 보여준다
- H2 콘솔을 활성화한다
- H2 콘솔을 자동활성화 시켜주어 웹 브라우저로 접속하면 애플리케이션에서 사용하는 데이터를 확인 할 수 있다
'BackEnd > Spring In Action' 카테고리의 다른 글
Chap5. 구성 속성 사용하기 (0) | 2020.08.23 |
---|---|
Chap3. 데이터로 작업하기 (0) | 2020.08.22 |
Chap2. 웹 애플리케이션 개발하기 (0) | 2020.08.22 |