๐ŸŒฑJAVA SPRING_์ž๋ฐ” ์Šคํ”„๋ง์˜ ๊ธฐ์ดˆ ๊ฐœ๋…

17885 ๋‹จ์–ด Java SpringJava Spring

[์Šคํ”„๋ง์˜ ๊ฐœ๋…]

โœ”๏ธJAVA Spring์ด๋ž€?

: JAVA Spring์ด๋ž€ ์ž๋ฐ”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ž€ ๋ผˆ๋Œ€๋‚˜ ๊ทผ๊ฐ„์„ ์ด๋ฃจ๋Š” ์ฝ”๋“œ๋“ค์˜ ๋ฌถ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ ์ด๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ํ‹€์ด๋ผ๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธํ๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ์ •ํ•˜๊ณ , ํŒ€์›๋“ค์€ ์ด ์œ„์— ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ตฌ์กฐ๋ฅผ ์ด๋ฏธ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์กฐ๋ฆฝํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์ด๋Ÿฌํ•œ ์žฅ์ ์œผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์ผ์ •ํ•œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜๋ฉฐ ๊ฐœ๋ฐœ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ” ์Šคํ”„๋ง์€ '๊ฒฝ๋Ÿ‰ ํ”„๋ ˆ์ž„์›Œํฌ' ์ด๋ฉฐ ๊ธฐ์กด์˜ ๋ณต์žกํ•œ ๊ตฌ๋™ํ™˜๊ฒฝ์„ ๋ฒ—์–ด๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ ์œ„์ฃผ๋กœ ๊ฐ„๋‹จํ•œ jarํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌ์„ฑ๋œ ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค.

โœ”๏ธJAVA Spring์˜ ์ฃผ์š” ํŠน์ง•

๐Ÿ”Ž POJO(Plain Old Java Object) ๊ธฐ๋ฐ˜์˜ ๊ตฌ์„ฑ

: ์Šคํ”„๋ง์€ ๊ฐ์ฒด๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์€ ๋‹ค๋ฆ„ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋‹ฌ๋ฆฌ ์ด ๊ด€๊ณ„๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋ณ„๋„์˜ API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” POJO ์˜ ๊ตฌ์„ฑ๋งŒ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜์ ์ธ JAVA์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์—ฌ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”Ž ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ํ†ตํ•œ ๊ฐ์ฒด๊ฐ„์˜ ๊ด€๊ณ„๊ตฌ์„ฑ

: ์˜์กด์„ฑ์ด๋ž€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—†์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ฃผ์ž…์ด๋ž€ ์™ธ๋ถ€์—์„œ ๋ฐ€์–ด ๋„ฃ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€ ์–ด๋– ํ•œ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ๋ฐ€์–ด๋„ฃ๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ํ•˜๋‚˜์˜ ์กด์žฌ๊ฐ€ ์˜์กด์„ฑ์ด ํ•„์š”ํ•œ ๊ฐ์ฒด์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์„œ '์ฃผ์ž…' ํ•ด์ฃผ๋Š” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ง์—์„œ 'ApplicationContext'๋ผ๋Š” ์กด์žฌ๊ฐ€ ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ์ด๋Š” ์กด์žฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์ž…ํ•ด์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด์™€ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์ƒ์„ฑํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ ์—ฎ์–ด์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง์—์„œ ApplicationContext๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ '๋นˆ(Bean)' ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ๋นˆ๊ณผ ๋นˆ์‚ฌ์ด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ 'XML์„ค์ •', '@์–ด๋…ธํ…Œ์ด์…˜์„ค์ •', 'JAVA ์„ค์ •๋ฐฉ์‹'์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿšฉ์˜์กด์„ฑ ์ฃผ์ž… ํ…Œ์ŠคํŠธ

: ์˜์กด์„ฑ ์„ค์ • ๋ฐฉ์‹์œผ๋กœ XML์ด๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•  ๊ฒƒ์ด๋ฉฐ, LOMBOK์„ ์ด์šฉํ•˜์—ฌ setter๋ฉ”์†Œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

(**Lombok : JAVA ๊ฐœ๋ฐœ์‹œ ์ž์ฃผ ์ด์šฉํ•˜๋Š” getter/setter, toString(), ์ƒ์„ฑ์ž ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

๐Ÿ’ก<pom.xml> : lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ log4j๋ฒ„์ „ ๋ณ€๊ฒฝ (1.2.15 -> 1.2.17)

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.22</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

๐Ÿ’กex00 ํ”„๋กœ์ ํŠธ์— 'org.zerock.sample'ํŒจํ‚ค์ง€ ์ƒ์„ฑ ํ›„ Restaurantํด๋ž˜์Šค์™€ Chefํด๋ž˜์Šค ์ƒ์„ฑ

<Chef.java>

package org.zerock.sample;

import org.springframework.stereotype.Component;
import lombok.Data;

@Component
@Data
public class Chef {

}

<Restaurant.java>

## Chef.java๋ฅผ ์ฃผ์ž…๋ฐ›๋„๋ก ์„ค๊ณ„
package org.zerock.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.Data;
import lombok.Setter;

@Component ## ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์Šคํ”„๋ง์—์„œ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๋Œ€์ƒ์ž„์„ ํ‘œ์‹œ
@Data  ## Data์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ Lombok์˜ setter์ƒ์„ฑ๊ธฐ๋Šฅ๊ณผ ์ƒ์„ฑ์ž, toString()๋“ฑ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ฒŒํ•จ
public class Restaurant {
	
	@Setter(onMethod= @_({@Autowired})) ## onMethod ์†์„ฑ์€ ์ƒ์„ฑ๋˜๋Š” setChef()์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•จ
	private Chef chef;

}

์Šคํ”„๋ง์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด '๋นˆ(Bean)' ์— ๋Œ€ํ•œ ์„ค์ •์„ ์œ„ํ•œ XML์„ค์ •ํŒŒ์ผ

๐Ÿ’ก<root-context.xml> : Namespacesํƒญ์—์„œ context๋ฅผ ์„ ํƒ ํ›„ ์ฝ”๋“œ ์ถ”๊ฐ€

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	<context:component-scan base-package="org.zerock.sample">
	</context:component-scan>
</beans>

๐Ÿ’ก๊ทธ ํ›„ ์•„๋ž˜ BeansGraph๋ฅผ ๋ณด๋ฉด Restaurant ์™€ Chef๊ฐ์ฒด๊ฐ€ ์„ค์ •๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

๐Ÿ’กroot-context.xml ์ž‘๋™ ์ˆœ์„œ

  1. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ๋จผ์ € ์Šคํ”„๋ง์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ (Context)๋ฅผ ๋งŒ๋“ค๊ณ  ApplicationContext๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ
  2. ์Šคํ”„๋ง์€ ์ž์‹ ์ด ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๊ฐ์ฒด(Bean)๋“ค์— ๋Œ€ํ•ด root-context.xml์— ์„ค์ •
  3. root-context.xml์— ์„ค์ •๋˜์–ด์žˆ๋Š” <context:component-scan> ํƒœ๊ทธ์˜ ๋‚ด์šฉ์„ ํ†ตํ•ด 'org.zerock.sample' ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”
  4. ํ•ด๋‹น ํŒจํ‚ค์ง€์— ์žˆ๋Š” ํด๋ž˜์Šค๋“ค ์ค‘์— @Component๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
  5. Restaurant๊ฐ์ฒด๋Š” Chef๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” @Autowired์–ด๋…ธํ…Œ์ด์…˜(ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์Šคํ”„๋ง์œผ๋กœ๋ถ€ํ„ฐ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•ด๋‹ฌ๋ผ๋Š” ํ‘œ์‹œ/ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋“ค๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋˜๋„๋ก ํ•จ) ์„ค์ •์ด ์žˆ์œผ๋ฏ€๋กœ ์Šคํ”„๋ง์€ Chef๊ฐ์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ Restaurant ๊ฐ์ฒด์— ์ฃผ์ž…

๐Ÿ’ก new Restaurant()์™€ ๊ฐ™์ด Restaurant ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์ ์ด ์—†๋Š”๋ฐ๋„ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋‹ค๋Š” ์ ์—์„œ ์Šคํ”„๋ง์€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜๋“ฑ์„ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ผ์ข…์˜ '์ปจํ…Œ์ด๋„ˆ'๋‚˜ 'ํŒฉํ† ๋ฆฌ' ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅํ•จ

โžก ์ฆ‰, 1) ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋™์ž‘ํ–ˆ๊ณ , 2) ๋™์ž‘ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์ด ์Šคํ”„๋ง์— ๋“ฑ๋ก๋๊ณ  (@ContextConfiguration), 3) ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ๊ฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ์ฃผ์ž…์ด ์ด๋ฃจ์–ด์กŒ๋‹ค(@Autowired)

๐Ÿ’ก์ฝ”๋“œ์— ์‚ฌ์šฉ๋œ ์–ด๋…ธํ…Œ์ด์…˜

Lombok ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜Spring ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜Test ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜
@Setter@Autowired@RunWith
@Data@Component@ContextConfiguration
@Log4j@Test

@Setter

: setter๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์—ญํ•  / 3๊ฐ€์ง€ ์†์„ฑ(value, onMethod, onParam)์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Œ

  • value : ์ ‘๊ทผ ์ œํ•œ ์†์„ฑ
  • onMethod : setter๋ฉ”์„œ๋“œ ์ƒ์„ฑ์‹œ ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€ํ•  ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง€์ •ํ•จ (@Setter(onMethod_={@AnnotationGohere})
  • onParam : setter๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ ์šฉํ•จ

@Data

: @ToString, @EqualsAndHashCode, @Getter/@Setter, @RequiredArgsConstructor๋ฅผ ๋ชจ๋‘ ๊ฒฐํ•ฉํ•œ ํ˜•ํƒœ๋กœ ํ•œ๋ฒˆ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ (์„ธ๋ถ€์„ค์ •์ด ํ•„์š”์—†๋Š” ๊ฒฝ์šฐ ํ•œ๋ฒˆ์— ์‚ฌ์šฉ)

@Log4j

: ๋กœ๊ทธ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
@Log๋ฅผ ํด๋ž˜์Šค์ชฝ์— ๋ถ™์—ฌ๋‘๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ static final๋กœ Logger๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์‹œ ๋ณ„๋„์˜ ๋กœ๊ทธ๋ฅผ ์„ค์ •ํ•  ํ•„์š”์—†์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์Œ. 'Spring Legacy Progject'๋กœ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Log4j ์„ค์ •์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ์„ค์ •ํ•„์š”์—†์ด @Log4j๋งŒ์œผ๋กœ๋„ ๋กœ๊ทธ๊ฐ์ฒด๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Œ

@Component

: ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์Šคํ”„๋ง์—์„œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์ƒ์ž„์„ ๋ช…์‹œ
@ComponentScan์„ ํ†ตํ•ด์„œ @Component๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง์ด ์ฝ์–ด์ฃผ๋„๋ก ์ง€์ •ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ์กฐ์‚ฌํ•˜๋ฉด์„œ @Component๊ฐ€ ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค๋“ค์„ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋นˆ์œผ๋กœ ๊ด€๋ฆฌํ•จ

@Autowired

: ์Šคํ”„๋ง ๋‚ด๋ถ€์—์„œ ์ž์‹ ์ด ํŠน์ •ํ•œ ๊ฐ์ฒด์— ์˜์กด์ ์ด๋ฏ€๋กœ ์ž์‹ ์—๊ฒŒ ํ•ด๋‹น ํƒ€์ž…์˜ ๋นˆ์„ ์ฃผ์ž…ํ•ด์ฃผ๋ผ๋Š” ํ‘œ์‹œ
์Šคํ”„๋ง์€ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณด๊ณ  ์Šคํ”„๋ง ๋‚ด๋ถ€์— ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด๋“ค ์ค‘์— ์ ๋‹นํ•œ ๊ฒƒ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•จ

@ContextConfiguratio

: ์Šคํ”„๋ง์ด ์‹คํ–‰๋˜๋ฉด์„œ ์–ด๋–ค ์„ค์ •์ •๋ณด๋ฅผ ์ฝ์–ด ๋“ค์—ฌ์•ผํ•˜๋Š”์ง€ ๋ช…์‹œํ•จ

@Runwith

: ํ…Œ์ŠคํŠธ์‹œ ํ•„์š”ํ•œ ํด๋ž˜์Šค ์ง€์ •. ์Šคํ”„๋ง์€ SpringJUnit4ClassRunner ํด๋ž˜์Šค๊ฐ€ ๋Œ€์ƒ์ด ๋จ

@Test

: junit์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ jUnit์ƒ์—์„œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ์˜ ๋Œ€์ƒ์ธ์ง€ ์•Œ๋ ค์คŒ


๐Ÿ”Ž AOP (Aspect-Oriented-Programming)์ง€์›

: AOP๋ฐฉ์‹์€ ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ž…๋‹ˆ๋‹ค. ์ด๋Š” 'ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„)'์„ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ•ต์‹ฌ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ ์šฉํ• ๋•Œ ์ฝ”๋“œ ์ˆ˜์ •์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›ํ•˜๋Š” ๊ด€์‹ฌ์‚ฌ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ˆ˜์›”ํ•œ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”Ž ํŽธ๋ฆฌํ•œ MVC ๊ตฌ์กฐ


๐Ÿ”Ž WAS์˜ ์ข…์†์ ์ด์ง€ ์•Š์€ ๊ฐœ๋ฐœํ™˜๊ฒฝ


โœ”๏ธ์ž๋ฐ” Refelction

๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋ถ„์„ํ•ด๋‚ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

์ž๋ฐ” ์Šคํ”„๋ง์„ ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์— '์ž๋ฐ” reflection'์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋จผ์ € ํŒŒ์•…ํ•˜๋ฉด, ์ž๋ฐ” ์Šคํ”„๋ง์— ๋Œ€ํ•ด ์กฐ๊ธˆ์€ ๋” ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์ˆ˜์›”ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ์€ BeanFactory๋ผ๋Š” Spring Factory์ธ๋ฐ, ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•œ ํ›„ ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœ๋  ๋‹น์‹œ์˜ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•„์š”ํ•œ ๊ธฐ์ˆ ์„ reflection ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

reflection์€ ์‹คํ–‰์ค‘์ธ ์ž๋ฐ”ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ๋‚ด๋ถ€์˜ ์†์„ฑ์„ ์ˆ˜์ •๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

(โžก ์–ด๋–ค ์ž๋ฐ” ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฉค๋ฒ„์˜ ์ด๋ฆ„์„ ์–ป๊ฑฐ๋‚˜ ๋ณด์—ฌ์คŒ)

๐Ÿ’ก๊ธฐ์กด์˜ ๋ถ„๊ธฐ ๋ฐฉ์‹

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜๋Š” if(๋ถ„๊ธฐ)๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋‚ด์ง€๋งŒ

์œ„์™€๊ฐ™์ด

if (๊ฐ’ =/user){
	user();
    }

๋ถ„๊ธฐ๊ฐ€ ๊ณ„์† ๋Š˜์–ด๋‚œ๋‹ค๋ฉด ๊ณ„์† IF๋ฌธ์„ ์ž‘์„ฑํ•ด์ค„ ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ, ์•Œ๊ณ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์— ํ•œํ•ด IF๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ reflection์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ค ํ•จ์ˆ˜(๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š์€)๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์•˜๋‹ค.

์ด์™€ ๊ฐ™์ด ์ž๋ฐ” ์Šคํ”„๋ง์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ ์ž๋ฐ” reflection์„ ๊ธฐ์ดˆ์— ๋‘๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ