BE/Spring in Action 5th

1장, 스프링 기초 (스프링 동작원리, 스프링 어플리케이션 초기설정)

잠수함 2021. 10. 28. 18:19
728x90

1-1. 스프링 동작 원리

- 스프링 어플리케이션 컨텍스트라는 컨테이너를 제공하는데, 이것은 어플리케이션 컴포넌트들을 생성, 관리함.

=>  컨테이너에서 컴포넌트들을 관리, 생성의 의미

 

- 어플리케이션 컴포넌트 or 은 스프링 어플리케이션 컨텍스트 내부에서 서로 연결되어 완전한 APP를 만든다.

 

- 의 상호 연결은 의존성주입의 패턴을 기반으로 수행됨.

=> APP 컴포넌트에 의존하는 다른 빈의 생성과 관리를 자체적으로 하는 대신 별도의 컨테이너가 해주며, 이 컨테이너는 모든 컴포넌트를 생성, 관리, 해당 컴포넌트를 필요로 하는 빈에 주입하여 연결.

 

어플리케이션 컴포넌트는 스프링 어플리케이션 컨텍스트에 의해 관리되고 상호 주입된다.

 

- @Configuration 어노테이션: 각 빈을 스프링 어플리케이션 컨텍스트에 제공하는 구성 클래스라는 것을 스프링에게 알려줌. 

 

1-2. 스프링 어플리케이션 초기 설정하기

- 스프링 Initializer를 사용해서 초기 설정하기.

 

- 스프링 Initializer는 REST API를 사용하는 브라우저 기반의 웹 어플리케이션이며, 우리가 원하는 기능을 구현할 수 있는 스프링 프로젝트의 구조를 생성해 준다.

 

- STS를 통한 설치: https://spring.io/tools 에서 운영체제에 맞는 버전을 다운로드 후 설치

- 설치 후 sts-4.12.1.RELEASE 서브 디렉터리 아래에 있는 SpringToolSuite4.exe를 실행

 

- 프로젝트 생성

 

- 웹 어플리케이션의 경우 WAR파일로 패키징되며, JAR 파일은 라이브러리와 데스크톱 UI 어플리케이션의 패키징에 사용되기 때문, JAR 패키징은 클라우드를 염두에 둔 선택.

 

- 라이브러리 지정

현재 가장 기본적으로 필요한것만 지정.

 

- 프로젝트 구조

 

- 전형적인 Maven OR Gradle 프로젝트 구조

- 어플리케이션 소스코드: src/main/java

- 테스트 코드: src/test/java

- 자바 리소스가 아닌것: src/main/resources

- mvnw, mvnw.cmd: 메이븐 래퍼 스크립트, 메이븐이 각자 컴퓨터에 설치되어 있지 않더라도 이 스크립트를 사용하여 프로젝트를 빌드할 수 있다.

- pom.xml: 메이븐 빌드 명세를 지정한 파일

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.6</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>sla</groupId>
	<artifactId>taco-cloud</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>taco-cloud</name>
	<description>Taco Cloud Example</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

- <parent>: 부모 POM은 스프링 프로젝트에 흔히 사용되는 여러 라이브러리의 의존성관리를 제공

 

- 어플리케이션 부트스트랩 구동

- @SpringBootApplication: 이 코드가 스프링 부트 어플리케이션임을 나타냄.

  -- @SpringBootConfiguration: 현재 클래스를 구성 클래스로 지정.

  -- @EnableAutoConfiguration: 스프링 부트 자동 - 구성을 활성화

  -- @ComponentScan: 컴포넌트 검색 활성화

 

- main() 메소드: JAR파일이 실행될 때 호출되어 실행되는 메서드. 실제로 어플리케이션을 시작시키고 스프링 어플리케이션 컨텍스트를 생성하는 SpringApplication 클래스의 run() 메서드를 호출.

 

- 어플리케이션 테스트하기

src/test/java의 TacoCloudApplicationTests.java 파일에서 확인

- @SpringBootTest: 스프링 부트 기능으로 테스트를 시작하라는 것을 JUnit에 알려준다.