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 νŒŒμΌμ€ 기쑴의 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 배포할 λ•ŒλŠ” μ ν•©ν•˜μ§€λ§Œ, λŒ€λΆ€λΆ„μ˜ ν΄λΌμš°λ“œ ν”Œλž«νΌμ—λŠ” 잘 λ§žμ§€ μ•ŠλŠ”λ‹€

μ™œ 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에 μ•Œλ €μ€€λ‹€.

SpringBootTest에 λŒ€ν•΄μ„œ 더 ν™•μΈν•΄λ³΄μž

μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž‘μ„±ν•˜κΈ°

μ›Ή μš”μ²­ μ²˜λ¦¬ν•˜κΈ°

@Component, @Service, @Repositoryλ₯Ό ν¬ν•¨ν•΄μ„œ μ†Œμˆ˜μ˜ λ‹€λ₯Έ μ• λ…Έν…Œμ΄μ…˜λ“€λ„ @Controller와 λ™μΌν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λ―€λ‘œ 이런 μ• λ…Έν…Œμ΄μ…˜λ“€ 쀑 μ–΄λŠ 것을 μ‚¬μš©ν•΄λ„ λœλ‹€. κ·ΈλŸ¬λ‚˜ @Controllerλ₯Ό μ„ νƒν•œ μ΄μœ λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œμ˜ μ»΄ν¬λ„ŒνŠΈ 역할을 더 잘 μ„€λͺ…ν•΄ μ£ΌκΈ° λ•Œλ¬Έμ΄λ‹€.

@Controllerλ₯Ό @Service둜 λŒ€μ²΄ν•  수 μžˆμ„κΉŒ?

컨트둀러 ν…ŒμŠ€νŠΈν•˜κΈ°

@WebMvcTest(HomeController.class)
public class HomeControllerTest {
	...
}

@SpringBootTest λŒ€μ‹  @WebMvcTest μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μŠ€ν”„λ§ MVC μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν˜•νƒœλ‘œ ν…ŒμŠ€νŠΈκ°€ μ‹€ν–‰λ˜λ„λ‘ ν•œλ‹€. 즉, HomeControllerκ°€ μŠ€ν”„λ§ MVC에 λ“±λ‘λ˜λ―€λ‘œ μš°λ¦¬κ°€ μŠ€ν”„λ§ MVC에 μ›Ή μš”μ²­μ„ 보낼 수 μžˆλ‹€.

@WebMvcTestλŠ” λ˜ν•œ μŠ€ν”„λ§ MVCλ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ μŠ€ν”„λ§ 지원을 μ„€μ •ν•œλ‹€. μ΄λ•Œ 우리 ν…ŒμŠ€νŠΈμ—μ„œλŠ” μ‹€μ œ μ„œλ²„λ₯Ό μ‹œμž‘ν•˜λŠ” λŒ€μ‹  μŠ€ν”„λ§ MVC의 λͺ¨ν‚Ή(mocking) λ§€μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•΄λ„ μΆ©λΆ„ν•˜λ―€λ‘œ λͺ¨μ˜ ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ° μœ„ν•΄ 우리 ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€μ— MockMvc 객체λ₯Ό μ£Όμž…(μ—°κ²°)ν•œλ‹€.

μŠ€ν”„λ§ λΆ€νŠΈ DevTools μ•Œμ•„λ³΄κΈ°

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파일둜 μƒκ°ν•˜μ‹œλ©΄ 될 것 κ°™λ‹€.

⚠️ **GitHub.com Fallback** ⚠️