chap 1 incheol - JAVA-JIKIMI/SPRING-IN-ACTION-5 GitHub Wiki
μ€νλ§ μΈ μ‘μ (5ν) μ±ν° 1μ₯μ μμ½ν λ΄μ© μ λλ€.
μ€νλ§
μ μ€νλ§ μ ν리μΌμ΄μ
컨ν
μ€νΈ
λΌλ 컨ν
μ΄λ
λ₯Ό μ 곡νλλ°, μ΄κ²μ μ ν리μΌμ΄μ
μ»΄ν¬λνΈ
λ€μ μμ±νκ³ κ΄λ¦¬νλ€. κ·Έλ¦¬κ³ μ ν리μΌμ΄μ
μ»΄ν¬λνΈ λλ λΉ(bean)
λ€μ μ€νλ§ μ ν리μΌμ΄μ
컨ν
μ€νΈ λ΄λΆμμ μλ‘ μ°κ²°λμ΄ μμ ν μ ν리μΌμ΄μ
μ λ§λ λ€.
λΉμ μνΈ μ°κ²°μ μμ‘΄μ± μ£Όμ
μ΄λΌκ³ μλ €μ§ ν¨ν΄μ κΈ°λ°μΌλ‘ μνλλ€. μ¦, μ ν리μΌμ΄μ
μ»΄ν¬λνΈμμ μμ‘΄(μ¬μ©)νλ λ€λ₯Έ λΉμ μμ±κ³Ό κ΄λ¦¬λ₯Ό μ체μ μΌλ‘ νλ λμ λ³λμ λ체(컨ν
μ΄λ
)κ° ν΄μ£Όλ©°, μ΄ κ°μ²΄μμλ λͺ¨λ μ»΄ν¬λνΈλ₯Ό μμ±, κ΄λ¦¬νκ³ ν΄λΉ μ»΄ν¬λνΈ
λ₯Ό νμλ‘ νλ λΉμ μ£Όμ
(μ°κ²°)
νλ€. μΌλ°μ μΌλ‘ μ΄κ²μ μμ±μ
μΈμ λλ μμ±μ μ κ·Όμ λ©μλ
λ₯Ό ν΅ν΄ μ²λ¦¬λλ€.
μ§κΈκΉμ§μ μ€νλ§ λ²μ μμλ μ»΄ν¬λνΈ λ° λ€λ₯Έ μ»΄ν¬λνΈ λ° λ€λ₯Έ μ»΄ν¬λνΈμμ κ΄κ³λ₯Ό λνλ΄λ νλ μ΄μμ XML
νμΌμ μ¬μ©ν΄μ λΉμ μνΈ μ°κ²°νλλ‘ μ€νλ§ μ ν리μΌμ΄μ
컨ν
μ€νΈ
μ μλ €μ£Όμλ€.
<bean id="inventoryService" class="com.example.InventoryService" />
<bean id="productService" class="com.example.ProductService">
<constructor-arg ref="inventoryService" />
<bean>
κ·Έλ¬λ μ΅μ λ²μ μ μ€νλ§μμλ μλ° κΈ°λ°μ ꡬμ±(configuration)
μ΄ λ λ§μ΄ μ¬μ©λλ€.
@Configuration
public class ServiceConfiguration {
@Bean
public InventoryService inventoryService() {
return new InventoryService();
}
@Bean
public ProductService productSerivce() {
return new ProductService(inventoryService());
}
}
@Configuration
μ λ
Έν
μ΄μ
μ κ° λΉμ μ€νλ§ μ ν리μΌμ΄μ
컨ν
μ€νΈμ μ 곡νλ κ΅¬μ± ν΄λμ€λΌλ κ²μ μ€νλ§μκ² μλ €μ€λ€. κ΅¬μ± ν΄λμ€μ λ©μλμλ @Bean
μ λ
Έν
μ΄μ
μ΄ μ§μ λμ΄ μμΌλ©°, μ΄κ²μ κ° λ©μλμμ λ°νλλ κ°μ²΄κ° μ ν리μΌμ΄μ
컨ν
μ€νΈ
μ λΉμΌλ‘ μΆκ°λμ΄μΌ νλ€λ κ²μ λνλΈλ€.
μ€νλ§
μ μλμΌλ‘ μ»΄ν¬λνΈλ€μ ꡬμ±ν μ μλ μλ-ꡬμ±
κΈ°λ₯μ΄ μλ€. μλ-ꡬμ±μ μλ μ°κ²°κ³Ό μ»΄ν¬λνΈ κ²μμ΄λΌλ μ€νλ§ κΈ°λ²μ κΈ°λ°μΌλ‘ νλ€. μ»΄ν¬λνΈ κ²μμ μ¬μ©νμ¬ μ€νλ§μ μλμΌλ‘ μ ν리μΌμ΄μ
μ classpath
μ μ§μ λ μ»΄ν¬λνΈ
λ₯Ό μ°Ύμ ν μ€νλ§ μ ν리μΌμ΄μ
컨ν
μ€νΈμ λΉ
μΌλ‘ μμ±ν μ μλ€. λν, μ€νλ§μ μλ μ°κ²°
μ μ¬μ©νμ¬ μμ‘΄ κ΄κ³κ° μλ μ»΄ν¬λνΈλ₯Ό μλμΌλ‘ λ€λ₯Έ λΉμ μ£Όμ
(μ°κ²°)νλ€.
κΈ°μ‘΄μ μλ° μΉ μ ν리μΌμ΄μ
μ WAR
νμΌλ‘ ν¨ν€μ§λλ©°, JAR
νμΌμ λΌμ΄λΈλ¬λ¦¬μ λ°μ€ν¬ν± UI μ ν리μΌμ΄μ
μ ν¨ν€μ§μ μ¬μ©λκΈ° λλ¬Έμ΄λ€.
JAR
ν¨ν€μ§μ ν΄λΌμ°λλ₯Ό μΌλμ λ μ νμ΄λ€. WAR
νμΌμ κΈ°μ‘΄μ μλ° μ ν리μΌμ΄μ
μλ²μ μ ν리μΌμ΄μ
μ λ°°ν¬ν λλ μ ν©νμ§λ§, λλΆλΆμ ν΄λΌμ°λ νλ«νΌμλ μ λ§μ§ μλλ€
μνλ ꡬμ±μ ν μ μλ JAR ν¬λ§·κ³Ό λ¬λ¦¬ WARμ WEB-INF λ° META-INF λλ ν λ¦¬λ‘ μ¬μ μ μ λ ꡬ쑰λ₯Ό μ¬μ©νλ©° WARνμΌμ μ€ννλ €λ©΄ Tomcat, Weblogic, Websphere λ±μ μΉ μλ² (WEB)λλ μΉ μ»¨ν μ΄λ(WAS)κ° νμνλ€.
WAR νμΌλ JAVAμ JAR μ΅μ ( java - jar)μ μ΄μ©ν΄ μμ±νλ JARνμΌμ μΌμ’ μΌλ‘ μΉμ΄ν리μΌμ΄μ μ 체λ₯Ό ν¨ν€μ§νκΈ° μν JARνμΌλ‘ μκ°νμλ©΄ λ κ² κ°λ€.
<?xml version="1.0" encoding="UTF-8"?>
<product xmlns="http://maven.aphache.org/POM/4.0.0"
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thyumeleaf</artifactId>
</dependency>
...
</dependencies>
<parent>
νκ·Έλ μ°λ¦¬ νλ‘μ νΈκ° λΆλͺ¨ POM(Product Object Model)
μΌλ‘ spring-boot-starter-parent
λ₯Ό κ°λλ€λ κ²μ μ§μ νλ€. μ΄ λΆλͺ¨ POM
μ μ€νλ§ νλ‘μ νΈμ νν μ¬μ©λλ μ¬λ¬ λΌμ΄λΈλ¬λ¦¬μ μμ‘΄μ± κ΄λ¦¬λ₯Ό μ 곡νλ€.
μμ‘΄μ±μ <dependencies>
μμμ μ μλλ€. Spring web
, Thymeleaf
, Test
μμ‘΄μ± νλͺ©μ <artifactId>
μ stater
λ¨μ΄λ₯Ό ν¬ν¨νκ³ μμμ μ μ μλ€. μ€νν° μμ‘΄μ±μ λ€μ μΈ κ°μ§ μ₯μ μ΄ μλ€.
- μ°λ¦¬κ° νμλ‘ νλ λͺ¨λ
λΌμ΄λΈλ¬λ¦¬
μ μμ‘΄μ±μ μ μΈνμ§ μμλ λλ―λ‘ λΉλ νμΌμ΄ ν¨μ¬ λ μμμ§κ³ κ΄λ¦¬νκΈ° μ¬μ΄μ§λ€. -
λΌμ΄λΈλ¬λ¦¬
μ΄λ¦μ΄ μλ κΈ°λ₯μ κ΄μ μΌλ‘ μμ‘΄μ±μ μκ°ν μ μλ€. λ°λΌμ λ§μΌ μΉ μ ν리μΌμ΄μ μ κ°λ°νλ€λ©΄ μΉ μ ν리μΌμ΄μ μ μμ±ν μ μκ² ν΄μ£ΌλλΌμ΄λΈλ¬λ¦¬
λ€μ μΌμΌμ΄ μ§μ νλ λμ μ μ¬κΈ°μ²λΌμΉ μ€νν° μμ‘΄μ±
λ§ μΆκ°νλ©΄ λλ€. -
λΌμ΄λΈλ¬λ¦¬
λ€μ λ²μ μ κ±±μ νμ§ μμλ λλ€.μ€νλ§ λΆνΈ
μ ν¬ν¨λλ λΌμ΄λΈλ¬λ¦¬λ€μ λ²μ μ νΈνμ΄ λ³΄μ₯λλ―λ‘ μ¬μ©νλ €λμ€νλ§ λΆνΈ
μλ²μ
λ§ μ κ²½ μ°λ©΄ λλ€.
μ€ν κ°λ₯ JAR
νμΌμμ μ ν리μΌμ΄μ
μ μ€ννλ―λ‘ μ μΌ λ¨Όμ μμλλ λΆνΈμ€νΈλ© ν΄λμ€
κ° μμ΄μΌ νλ€.
@SpringBootApplication
μ λ€μ μΈκ° μλ
Έν
μ΄μ
μ΄ κ²°ν©ν μ μ΄λ€.
- @SpringBootConfiguration: νμ¬ ν΄λμ€(
TacoCloudApplication
)λ₯Ό κ΅¬μ± ν΄λμ€λ‘ μ§μ νλ€. μμ§μ ꡬμ±μ΄ λ§μ§ μμ§λ§, νμνλ€λ©΄ μλ° κΈ°λ°μ μ€νλ§ νλ μμν¬ κ΅¬μ±μ νμ¬ ν΄λμ€ μΆκ°ν μ μλ€. μ€μ λ‘λ μ΄ μ λ Έν μ΄μ μ΄@Configuration:
νΉνλ ννμ΄λ€. - @EnableAutoConfiguration : μ€νλ§ λΆνΈ μλ ꡬμ±μ νμ±ννλ€. μλ ꡬμ±μ λμ€μ λ μμΈν μμλ³Ό κ²μ΄λ€. μΌλ¨ μ§κΈμ μ΄
μ λ Έν μ΄μ
μ΄ μ°λ¦¬κ° νμλ‘ νλμ»΄ν¬λνΈ
λ€μ μλμΌλ‘ ꡬμ±νλλ‘ μ€νλ§ λΆνΈμ μλ €μ€λ€λ κ²λ§ μμ λμ - @ComponentScan : μ»΄ν¬λνΈ κ²μμ νμ±ννλ€. μ΄κ²μ
@Component
,@Controller
,@Serivce
λ±μ μ λ Έν μ΄μ κ³Ό ν¨κ» ν΄λμ€λ₯Ό μ μΈν μ μκ² ν΄μ€λ€. κ·Έλ¬λ©΄ μ€νλ§μ μλμΌλ‘ κ·Έλ° ν΄λμ€λ₯Ό μ°Ύμ μ€νλ§ μ ν리μΌμ΄μ 컨ν μ€νΈμμ»΄ν¬λνΈ
λ‘ λ±λ‘νλ€.
@SpringBootTest
λ μ€νλ§ λΆνΈ κΈ°λ₯μΌλ‘ ν
μ€νΈλ₯Ό μμνλ κ²μ JUnit
μ μλ €μ€λ€.
@Component
, @Service
, @Repository
λ₯Ό ν¬ν¨ν΄μ μμμ λ€λ₯Έ μ λ
Έν
μ΄μ
λ€λ @Controller
μ λμΌν κΈ°λ₯μ μ 곡νλ―λ‘ μ΄λ° μ λ
Έν
μ΄μ
λ€ μ€ μ΄λ κ²μ μ¬μ©ν΄λ λλ€. κ·Έλ¬λ @Controller
λ₯Ό μ νν μ΄μ λ μ ν리μΌμ΄μ
μμμ μ»΄ν¬λνΈ μν μ λ μ μ€λͺ
ν΄ μ£ΌκΈ° λλ¬Έμ΄λ€.
@WebMvcTest(HomeController.class)
public class HomeControllerTest {
...
}
@SpringBootTest
λμ @WebMvcTest
μ λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ μ€νλ§ MVC μ ν리μΌμ΄μ
μ ννλ‘ ν
μ€νΈκ° μ€νλλλ‘ νλ€. μ¦, HomeController
κ° μ€νλ§ MVC
μ λ±λ‘λλ―λ‘ μ°λ¦¬κ° μ€νλ§ MVC
μ μΉ μμ²μ λ³΄λΌ μ μλ€.
@WebMvcTest
λ λν μ€νλ§ MVC
λ₯Ό ν
μ€νΈνκΈ° μν μ€νλ§ μ§μμ μ€μ νλ€. μ΄λ μ°λ¦¬ ν
μ€νΈμμλ μ€μ μλ²λ₯Ό μμνλ λμ μ€νλ§ MVC
μ λͺ¨νΉ(mocking
) 맀컀λμ¦μ μ¬μ©ν΄λ μΆ©λΆνλ―λ‘ λͺ¨μ ν
μ€νΈλ₯Ό νκΈ° μν΄ μ°λ¦¬ ν
μ€νΈ ν΄λμ€μ MockMvc
κ°μ²΄λ₯Ό μ£Όμ
(μ°κ²°
)νλ€.
DevTools
λ μ€νλ§ κ°λ°μμκ² λ€μκ³Ό κ°μ κ°λ° μμ μ νΈλ¦¬ν λꡬλ₯Ό μ 곡νλ€.
- μ½λκ° λ³κ²½λ λ μλμΌλ‘ μ ν리μΌμ΄μ
μ λ€μ μμμν¨λ€. (
**λ¨μ
μ μ ν리μΌμ΄μ μ΄ μλμΌλ‘ κ°μ μμλ λ μμ‘΄μ± λ³κ²½μ΄ μ μ©λ μ μλ€**) - λΈλΌμ°μ λ‘ μ μ‘λλ 리μμ€(μλ₯Ό λ€μ΄,
ν νλ¦Ώ
,μλ°μ€ν¬λ¦½νΈ
,μ€νμΌμνΈ
)κ° λ³κ²½λ λ μλμΌλ‘ λΈλΌμ°μ λ₯Ό μλ‘κ³ μΉ¨νλ€. -
ν νλ¦Ώ μΊμ
λ₯Ό μλμΌλ‘λΉνμ±ν
νλ€. - λ§μΌ
H2
λ°μ΄ν°λ² μ΄μ€κ° μ¬μ© μ€μ΄λΌλ©΄ μλμΌλ‘H2 μ½μ
μνμ±ν
νλ€.
μ€νν° μμ‘΄μ±
κ³Ό μλ-ꡬμ±
μΈμλ μ€νλ§ λΆνΈλ λ€μμ λ€λ₯Έ νΈλ¦¬ν κΈ°λ₯λ μ 곡νλ€.
-
μ‘μΆμμ΄ν°
λ μ ν리μΌμ΄μ μ λ΄λΆ μλμ λ°νμ μμ μ΄ν΄λ³Ό μ μλ κΈ°λ₯μ μ 곡νλ©°, μ¬κΈ°μλλ©νΈλ¦
,μ€λ λ λ€ν μ 보
,μ ν리μΌμ΄μ μ μν
,μ ν리μΌμ΄μ
μμ μ¬μ©ν μ μλ νκ²½ μμ±μ΄ ν¬ν¨λλ€. -
νκ²½ μμ±
μ λͺ μΈ - ν΅μ¬ νλ μμν¬μ μΆκ°λλ
ν μ€νΈ
μ§μ
κ°λ¨ν μλ° μΈν°νμ΄μ€
λ‘ μ ν리μΌμ΄μ
μ λ°μ΄ν° 리νμ§ν°λ¦¬
λ₯Ό μ μν μ μλ€. μ€νλ§ λ°μ΄ν°λ μλ‘ λ€λ₯Έ μ’
λ₯μ λ°μ΄ν°λ² μ΄μ€
μ ν¨κ» μ¬μ©λ μ μλ€.
μ€νλ§ μν리ν°
λ μΈμ¦
, νκ°
, API 보μ
μ ν¬ν¨νλ νλμ λ²μμ μ ν리μΌμ΄μ
보μ μꡬλ₯Ό λ€λ£¬λ€.
μ€νλ§ ν΅ν©
μ λ°μ΄ν°κ° μ¬μ© κ°λ₯ν μ¦μ μ²λ¦¬λλ μ€μκ° ν΅ν©
μ νλ€. λ°λ©΄μ μ€νλ§ λ°°μΉ
μμλ λ€λμ λ°μ΄ν°κ° μ²λ¦¬λλ μμ μ νΈλ¦¬κ±°
κ° μλ €μ€ λ λ°μ΄ν°κ° μμ§ μ²λ¦¬λλ λ°°μΉ ν΅ν©
μ μ²λ¦¬ν΄ μ€λ€.
-
μΉ μ ν리μΌμ΄μ μμ±
,λ°μ΄ν°λ² μ΄μ€ μ¬μ©
,μ ν리μΌμ΄μ 보μ
,λ§μ΄ν¬λ‘μλΉμ€
λ±μμ κ°λ°μμ λ Έλ ₯μ λμ΄μ£Όλ κ²μ΄ μ€νλ§μ λͺ©νλ€ - μ€νλ§ λΆνΈλ
μμ¬μ΄ μμ‘΄μ± κ΄λ¦¬
,μλ-ꡬμ±
, λ°νμ μμ μ ν리μΌμ΄μ λ΄λΆ μλ νμ μ μ€νλ§μμ ν μ μκ² νλ€. - μ€νλ§ μ ν리μΌμ΄μ
μ μ€νλ§
Initializer
λ₯Ό μ¬μ©ν΄μ μ΄κΈ° μ€μ ν μ μλ€. -
λΉ
μ΄λΌκ³ νλ μ»΄ν¬λνΈλ μ€νλ§ μ ν리μΌμ΄μ 컨ν μ€νΈμμ μλ°λXML
λ‘ μ μΈν μ μμΌλ©°, μ»΄ν¬λνΈ νμμΌλ‘ μ°Ύκ±°λ μ€νλ§ λΆνΈμλ-ꡬμ±
μμ μλμΌλ‘ ꡬμ±ν μλ μλ€.
μνλ ꡬμ±μ ν μ μλ JAR ν¬λ§·κ³Ό λ¬λ¦¬ WARμ WEB-INF λ° META-INF λλ ν λ¦¬λ‘ μ¬μ μ μ λ ꡬ쑰λ₯Ό μ¬μ©νλ©° WARνμΌμ μ€ννλ €λ©΄ Tomcat, Weblogic, Websphere λ±μ μΉ μλ² (WEB)λλ μΉ μ»¨ν μ΄λ(WAS)κ° νμνλ€.
WAR νμΌλ JAVAμ JAR μ΅μ ( java - jar)μ μ΄μ©ν΄ μμ±νλ JARνμΌμ μΌμ’ μΌλ‘ μΉμ΄ν리μΌμ΄μ μ 체λ₯Ό ν¨ν€μ§νκΈ° μν JARνμΌλ‘ μκ°νμλ©΄ λ κ² κ°λ€.