Notice
Recent Posts
Link
Today
Total
07-07 22:50
๊ด€๋ฆฌ ๋ฉ”๋‰ด

dingdong coding

์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ @ ๋ณธ๋ฌธ

๐ŸSpring/Basic

์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ @

๐Ÿถ ๊ฐœ๋ฐœ๊ฐœ๋ฐœ ๐Ÿพ 2022. 6. 14. 18:10

์–ด๋…ธํ…Œ์ด์…˜์ด๋ž€?

 @ ์‚ฌ์ธ ํ•˜๋‚˜๋กœ ๋งŽ์€ ์ปจํ…์ŠคํŠธ๋“ค์„ ์ œ๊ณต ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 @ ์‚ฌ์ธ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์–ด๋…ธํ…Œ์ด์…˜ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

Spring์œผ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ  ์–ด๋…ธํ…Œ์ด์…˜ ์—†์ด ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ณผ ์ˆ˜ ์—†๋‹ค. Controller ๋“ฑ๋ก์ด๋‚˜ Service, Repository, Test ๋“ฑ ์•ˆ์“ฐ์ด๋Š” ๊ณณ์ด ์—†์„ ์ •๋„๋‹ค.

 

๋งŽ์ด ์“ฐ์ž„์—๋„ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ ๊ฐ€๋” ์ƒ๊ฐ์ด ์•ˆ๋‚˜๊ฑฐ๋‚˜ ๊นŒ๋จน์„ ๋•Œ๊ฐ€ ์žˆ๊ธฐ์— ์ง€๊ธˆ์ด๋ผ๋„ ์กฐ๊ธˆ์”ฉ ์ •๋ฆฌํ•  ์ƒ๊ฐ์ด๋‹ค.

 

ํฌ์ŠคํŠธ์ž‡ ์ฒ˜๋Ÿผ ๊ณ„์† ์ถ”๊ฐ€ํ•  ์˜ˆ์ • โœ๏ธ

 

@AfterEach

: ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰

 

1)  Test Case๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ  : ๋ฉ”๋ชจ๋ฆฌ DB์— ๋‚จ์•„์žˆ๋Š” ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. (์ง์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ด์คŒ)

 

clearStore ๋ฉ”์„œ๋“œ 

public void clearStore(){
    store.clear();
}

 

test case์— ์ถ”๊ฐ€ 

@AfterEach
public void afterEach(){
    repository.clearStore();
}

@BeforeEach

: ๊ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „์— ํ˜ธ์ถœ

 

1)  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋„ ์ƒˆ๋กœ ๋งบ์–ด์คŒ

@BeforeEach
public void beforeEach(){
    memberRepository = new MemoryMemberRepository(); 
    memberService = new MemberService(memberRepository);
}

 

@AfterEach, @BeforeEach ๋ชจ๋‘ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์ž‘์„ฑ ์‹œ ๋ฐœ์ƒ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ 

@ComponentScan

: @Component, @Service, @Repository, @Controller, @Configuration ๋“ฑ๋“ฑ ์šฐ๋ฆฌ๊ฐ€ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์„ค์ •ํ•œ ๋นˆ๋“ค์„ ์ฐพ์•„์„œ ๋นˆ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ

: ํ•ด๋‹น @ComponentScan์ด ์ž‘์„ฑ๋œ ํŒจํ‚ค์ง€ ์ดํ•˜์˜ ํด๋ž˜์Šค๋“ค์„ ์ˆœํšŒํ•˜๋ฉฐ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋  ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ํ•œ๋‹ค.

 

** ํƒ์ƒ‰ํ•  ํŒจํ‚ค์ง€์˜ ์‹œ์ž‘์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

** ๊ถŒ์žฅ์‚ฌํ•ญ์€ ์•„๋‹ˆ๋‹ค. ์„ค์ • ์ •๋ณด ํด๋ž˜์Šค์˜ ์œ„์น˜๋ฅผ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ์— ๋‘๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

@ComponentScan(
	basePackages = "hello.core", basePackageClasses = AutoAppConfig.class,
)

•  basePackages : ํƒ์ƒ‰ํ•  ํŒจํ‚ค์ง€์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ด ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•ด์„œ ํ•˜์œ„ ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰

    •  basePackages = {"hello.core", "hello.service"} ์—ฌ๋Ÿฌ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

•  basePackageClasses : ์ง€์ •ํ•œ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๋ฅผ ํƒ์ƒ‰ ์œ„์น˜๋กœ ์ง€์ •ํ•œ๋‹ค.

๋งŒ์•ฝ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด @ComponentScan์ด ๋ถ™์€ ์„ค์ • ์ •๋ณด ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๊ฐ€ ์‹œ์ž‘ ์œ„์น˜๊ฐ€ ๋œ๋‹ค.

 

** @ComponentScan์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋นˆ์˜ ๊ธฐ๋ณธ์ด๋ฆ„์€ ํด๋ž˜์Šค ๋ช…์„ ์‚ฌ์šฉํ•˜๋˜ ๋งจ ์•ž๊ธ€์ž๋งŒ ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค **

  ๋นˆ ์ด๋ฆ„ ๊ธฐ๋ณธ ์ „๋žต : MemberServiceImpl ํด๋ž˜์Šค => memberServiceImpl

  ๋นˆ ์ด๋ฆ„ ์ง์ ‘ ์ง€์ • : ๋งŒ์•ฝ ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์„ ์ง์ ‘ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด @Component("memberService2") ์ด๋Ÿฐ์‹์œผ๋กœ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๋ฉด ๋œ๋‹ค.

 

** filter ์˜ต์…˜ **

 includeFilters : ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์„ ์ถ”๊ฐ€๋กœ ์ง€์ • 

    •  ์ถ”๊ฐ€ํ•  ํด๋ž˜์Šค๋Š” @MyIncludeComponent๋กœ ์ง€์ •ํ•ด ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๋œ๋‹ค.

   excludeFilters : ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์—์„œ ์ œ์™ธํ•  ๋Œ€์ƒ์„ ์ง€์ • 

    •   ์ œ์™ธํ•  ํด๋ž˜์Šค๋Š” @MyExcludeComponent๋กœ ์ง€์ •ํ•ด ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋กํ•˜์ง€ ์•Š๋Š”๋‹ค.

 @Configuration
 @ComponentScan(
 	includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
 	excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
 ) static class ComponentFilterAppConfig {
 
 }

** filter type ์˜ต์…˜ **

•  ANNOTATION : ๊ธฐ๋ณธ ๊ฐ’, ์• ๋…ธํ…Œ์ด์…˜์„ ์ธ์‹ํ•ด ๋™์ž‘

•  ASSIGNABLE_TYPE : ์ง€์ •ํ•œ ํƒ€์ž…๊ณผ ์ž์‹ ํƒ€์ž…์„ ์ธ์‹ํ•ด์„œ ๋™์ž‘

•  ASPECTJ : AspectJ ํŒจํ„ด ์‚ฌ์šฉ

•  REGEX : ์ •๊ทœ ํ‘œํ˜„์‹

•  CUSTOM : TypeFilter ์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์ฒ˜๋ฆฌ 

@Configuration

: ์Šคํ”„๋ง ์„ค์ • ์ •๋ณด์—์„œ ์‚ฌ์šฉ. ์Šคํ”„๋ง ์„ค์ • ์ •๋ณด๋กœ ์ธ์‹ํ•˜๊ณ , ์Šคํ”„๋ง ๋นˆ์ด ์‹ฑ๊ธ€ํ†ค์„ ์œ ์ง€ํ•˜๋„๋ก ์ถ”๊ฐ€์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

@Autowired

: ๊ฐ ์ƒํ™ฉ์˜ ํƒ€์ž…์— ๋งž๋Š” Ioc ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์กด์žฌํ•˜๋Š” Bean์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•ด ์ค€๋‹ค. ( DI  ์˜์กด์„ฑ ์ฃผ์ž… )

: ์ƒ์„ฑ์ž์— ์ง€์ •ํ•˜๋ฉด, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์•„์„œ ์ฃผ์ž…ํ•˜๊ณ , ์ƒ์„ฑ์ž์—์„œ ์—ฌ๋Ÿฌ ์˜์กด๊ด€๊ณ„๋„ ํ•œ๋ฒˆ์— ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. 

: 'getBean(MemberRepository.class)'์™€ ๋™์ผํ•˜๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋จ

: @Autowired์˜ ๊ธฐ๋ณธ๋™์ž‘์€ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์–ด๋„ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด

   @Autowired( required = false )๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

@Autowired(required = false)
public void setNoBean1(Member noBean1){ // Member๋Š” ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜์Œ
	System.out.println("noBean1 = " +noBean1);
}

** @Autowired( required = false ) **  ์™€ ๊ฐ™์ด ์ž๋™์ฃผ์ž… ๋Œ€์ƒ์„ ์˜ต์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• 

org.springframework.lang.@Nullable : ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด null์ด ์ž…๋ ฅ

Optional< > : ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด Optional.empty ๊ฐ€ ์ž…๋ ฅ

@Autowired
public void setNoBean2(@Nullable Member noBean2){ 
	System.out.println("noBean1 = " +noBean2);
}

@Autowired
public void setNoBean3(Optional<Member> noBean3){
	System.out.println("noBean1 = " +noBean3);
}

•  @Autowired๋Š” ๋นˆ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•ด์ฃผ๊ณ  Type์œผ๋กœ ์กฐํšŒ( ac.getBean(DiscountPolicy.class)์™€ ์œ ์‚ฌ )ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์กฐํšŒ ์‹œ ์„ ํƒ๋œ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.  ( ์ฆ‰ ์กฐํšŒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ )

 

.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy

 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

1.   @Autowired ํ•„๋“œ ๋ช… ๋งค์นญ

    : @Autowired๋Š” ํƒ€์ž… ๋งค์นญ์„ ์‹œ๋„ํ•˜๊ณ , ์ด ๋•Œ ์—ฌ๋Ÿฌ ๋นˆ์ด ์žˆ์œผ๋ฉด ํ•„๋“œ ์ด๋ฆ„, ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋นˆ ์ด๋ฆ„์„ ์ถ”๊ฐ€ ๋งค์นญํ•œ๋‹ค.

    : ํ•„๋“œ๋ช…์„ ๋นˆ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝ 

    : ํ•„๋“œ๋ช… ๋งค์นญ์€ ํƒ€์ž…๋งค์นญ์„ ๋จผ์ € ์‹œ๋„ํ•œ ํ›„์— ๊ทธ ๊ฒฐ๊ณผ ์—ฌ๋Ÿฌ ๋นˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€๋กœ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ 

2.   @Qualifier @Qualifier๋ผ๋ฆฌ ๋งค์นญ ๋นˆ ์ด๋ฆ„ ๋งค์นญ

3.   @Primary ์‚ฌ์šฉ 

@Qualifier 

: ๋นˆ ๋“ฑ๋ก ์‹œ ๋ช…์‹œ์ ์œผ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

:  ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด ๋นˆ์„ ๋งค์นญํ•˜๋Š” ๋ฐฉ๋ฒ• 

: ๋นˆ์„ ์ฃผ์ž… ๋ฐ›์„ ๋•Œ ๋ชจ๋“  ์ฝ”๋“œ์— @Qualifier์„ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

: ๋งค์šฐ ์ƒ์„ธํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. 

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
 						@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
 	this.memberRepository = memberRepository;
 	this.discountPolicy = discountPolicy;
}

@Primary 

:  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ @Autowired ์‹œ ์—ฌ๋Ÿฌ ๋นˆ์ด ๋งค์นญ๋˜๋ฉด @Primary๋กœ ์ง€์ •๋œ ๋นˆ์ด ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง„๋‹ค.

:  @Qualifier์ง€์ • ์—†์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ธฐ๋ณธ ๊ฐ’์ฒ˜๋Ÿผ ๋™์ž‘.

@RequiredArgsConstructor

: ์ƒ์„ฑ์ž ์ฃผ์ž… ์‹œ Lombok ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

: final or @NotNull์ด ๋ถ™์€ ํ•„๋“œ์˜ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ๋Š” Lombok @

: ์˜์กด์„ฑ ์ฃผ์ž…์˜ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณค ํ•œ๋‹ค.

@ResponseBody 

:  ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ HTTP ์š”์ฒญ์˜ body ๋‚ด์šฉ์œผ๋กœ ์ง์ ‘ ๋งคํ•‘

:  viewResolver ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

: ๊ธฐ๋ณธ ๋ฌธ์ž ์ฒ˜๋ฆฌ StringHttpMessageConverter

: ๊ธฐ๋ณธ ๊ฐ์ฒด ์ฒ˜๋ฆฌ : MappingJackson2HttpMessageConverter

: byte ์ฒ˜๋ฆฌ ๋“ฑ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ HttpMessageConverter๊ฐ€ ๊ธฐ๋ณธ ๋“ฑ๋ก 

@RequestBody

: @RequestBody์— ๋ถ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” HTTP ์š”์ฒญ์˜ ๋ณธ๋ฌธ body๋ถ€๋ถ„์ด ์ž๋ฐ” ๊ฐ์ฒด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ 

: json ํ˜•ํƒœ๋กœ ๋ฐ›์€ HTTP Body ๋ฐ์ดํ„ฐ๋ฅผ MessageConverter๋ฅผ ํ†ตํ•ด Java Object๋กœ ๋ณ€ํ™˜์‹œํ‚ด

: ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Body๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” HTTP Get ๋ฉ”์†Œ๋“œ์— @RequestBody๋ฅผ ํ™œ์šฉํ•˜๋ฉด Error

: ๊ฐ’์„ ์ฃผ์ž…ํ•˜์ง€ ์•Š๊ณ  ๋ณ€ํ™˜์„ ์‹œํ‚ค๋ฏ€๋กœ ๋ณ€์ˆ˜๋“ค์˜ ์ƒ์„ฑ์ž๋‚˜ Setter ํ•จ์ˆ˜๊ฐ€ ์—†์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์ด ํ• ๋‹น๋จ

@ModelAttribute

: ํด๋ผ๋ฆฌ์–ธํŠธ๊ฐ€ ์ „์†กํ•˜๋Š” multipart/form-data ํ˜•ํƒœ์˜ HTTP Body ๋‚ด์šฉ๊ณผ HTTP ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’๋“ค์„ ์ƒ์„ฑ์ž๋‚˜ Setter๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ

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

: ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ ์‹œ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์„ ์˜ค๋ธŒ์ ํŠธ ํ˜•ํƒœ๋กœ ๋งคํ•‘ํ•ด์ค€๋‹ค.

: ๊ฐ์ฒด ๋งคํ•‘

: Json์ด๋‚˜ XML๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ MessageConverter๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜์‹œํ‚ค๋Š” @RequestBody์™€ ๋‹ฌ๋ฆฌ, @ModelAttribute๋Š” multipart/form-data ํ˜•ํƒœ์˜ HTTP Body์™€ HTTP ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ์ƒ์„ฑ์ž๋‚˜ ์ˆ˜์ •์ž๋กœ ์ฃผ์ž…์‹œํ‚จ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

@RequestParam

@RequestParam( "๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ ์ด๋ฆ„" ) [ ๋ฐ์ดํ„ฐ ํƒ€์ž… ] [ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜ ]

: 1๊ฐœ์˜ HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ 

: @RequestParma์€ ํ•„์ˆ˜ ์—ฌ๋ถ€๊ฐ€ True์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ „์†ก๋˜์–ด์•ผ ํ•จ

: ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์œผ๋ฉด 404 Error 

: ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด required ๊ฐ’์„ false

@RequestMapping

: @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์€ Spring ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ 

: http request๋กœ ๋“ค์–ด์˜ค๋Š” url ํŠน์ • controller ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๋กœ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ์—ญํ• 

: controller์— class์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ํŠน์ • method์— ์ ์šฉ ๊ฐ€๋Šฅ 

@Controller

: ์ „ํ†ต์ ์ธ Spring MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ, ์ฃผ๋กœ View๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ. 

: ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด, ์›น ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌ 

: ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ(Bean) ๊ฐ์ฒด๊ฐ€ ๋˜์–ด ์„œ๋ธ”๋ฆฟ์šฉ ์ปจํ…Œ์ด๋„ˆ์— ์ƒ์„ฑ ( @Repository, @service ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋ฃจํŠธ ์ปจํ…Œ์ด๋„ˆ Bean ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค. )

@Service

: ์Šคํ”„์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์‚ฌ์šฉ. ์„œ๋น„์Šค ๋ ˆ์ด์–ด, ๋‚ด๋ถ€์—์„œ ์ž๋ฐ” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•จ 

: ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์„ ์ธ์‹ํ•˜๋Š”๋ฐ ๋„์›€ 

@Repository

: ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ.

: ๋ฐ์ดํ„ฐ ๊ณ„์ธต์˜ ์˜ˆ์™ธ๋ฅผ ์Šคํ”„๋ง ์˜ˆ์™ธ๋กœ ๋ณ€ํ™˜

: ์™ธ๋ถ€ I/O ์ฒ˜๋ฆฌ, ํผ์‹œ์Šคํ„ดํŠธ ๋ ˆ์ด์–ด, DB๋‚˜ ํŒŒ์ผ ๊ฐ™์€ ์™ธ๋ถ€ I/O ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•จ 

@GetMapping

: HTTP GET ์š”์ฒญ์„ ํŠน์ • ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์†Œ๋“œ์— ๋งคํ•‘, ์ฃผ์†Œ์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋…ธ์ถœ 

: ๋ฉ”์†Œ๋“œ์—๋งŒ ์ ์šฉ 

@RestController
public class UserController {
 
    @Autowired
    UserService userService;
 
    @GetMapping("users")
    public ResponseEntity<List<User>> getAll() {
        return new ResponseEntity<>(userService.getAll(), HttpStatus.OK);
    }
 
    @GetMapping("users/{id}")
    public ResponseEntity<User> getById(@PathVariable long id) {
        Optional<User> user = userService.getById(id);
        if (user.isPresent()) {
            return new ResponseEntity<>(user.get(), HttpStatus.OK);
        } else {
            throw new RecordNotFoundException();
        }
    }
}

@PathVariable

: ๊ฒฝ๋กœ์˜ ํŠน์ • ์œ„์น˜ ๊ฐ’์ด ๊ณ ์ •๋˜์ง€ ์•Š๊ณ  ๋‹ฌ๋ผ์งˆ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

: URL๊ฒฝ๋กœ์— ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ 

@PostMapping

: HTTP POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํŠน์ˆ˜ํ™”๋œ ์ฃผ์„ ๋ฒ„์ „. ์ฃผ์†Œ์ฐฝ์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ 

:  @RequestMapping(method = RequestMethod.POST) ์˜ ๋‹จ์ถ•ํ‚ค ์—ญํ• 

@PostMapping(path = "users", 
        consumes = MediaType.APPLICATION_JSON_VALUE, 
        produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<User> create(@RequestBody User newUser) {
    User user = userService.save(newUser);
    if (user == null) {
        throw new ServerException();
    } else {
        return new ResponseEntity<>(user, HttpStatus.CREATED);
    }
}

@SpringBootTest

: ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.

@Transactional

: TestCase์— @Transactional์ด ์žˆ์œผ๋ฉด ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ์ „์— ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘, ์™„๋ฃŒ ํ›„์—๋Š” ํ•ญ์ƒ RollBack 

: ๋‹ค์Œ Test์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.


๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ๋งคํ•‘  @Entity, @Table 

@Entity

: JPA ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•  ํด๋ž˜์Šค๋Š” @Entity ํ•„์ˆ˜์ 

: @Entity๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” JPA๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์—”ํ‹ฐํ‹ฐ๋ผ๊ณ  ๋ถˆ๋ฆผ 

 

์†์„ฑ

- name : JPA์—์„œ ์‚ฌ์šฉํ•  ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •, ๋ณดํ†ต ๊ธฐ๋ณธ ๊ฐ’์ธ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉ

 

• ์ฃผ์˜์‚ฌํ•ญ 

- ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜ ( JPA๊ฐ€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉ, ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” public ๋˜๋Š” protected  ์ƒ์„ฑ์ž )

- final ํด๋ž˜์Šค, enum, interface, inner class์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€ 

- ์ €์žฅํ•  ํ•„๋“œ์— final ์‚ฌ์šฉ ๋ถˆ๊ฐ€ 

@Table

: ์—”ํ‹ฐํ‹ฐ์™€ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์„ ์ง€์ •

: ์ƒ๋žต ์‹œ ๋งคํ•‘ํ•œ ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ

 

 ์†์„ฑ

- name : ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ” ์ด๋ฆ„ ( default ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ์‚ฌ์šฉ)

- catalog : catalog ๊ธฐ๋Šฅ์ด ์žˆ๋Š” DB์—์„œ catalog ๋งคํ•‘ ( default  DB๋ช… )

- schema : schema ๊ธฐ๋Šฅ์ด ์žˆ๋Š” DB์—์„œ schema๋ฅผ ๋งคํ•‘

- uniqueConstraints : DDL ์ƒ์„ฑ ์‹œ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ๋งŒ๋“ฆ , ์Šคํ‚ค๋งˆ ์ž๋™์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด DDL์„ ๋งŒ๋“ค ๋•Œ๋งŒ ์‚ฌ์šฉ

 

ํ•„๋“œ์™€ ์ปฌ๋Ÿผ ๋งคํ•‘  @Column

@Column

: ๊ฐ์ฒด ํ•„๋“œ๋ฅผ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์— ๋งคํ•‘

: ์†์„ฑ ์ค‘ name, nullable์ด ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ

 

 ์†์„ฑ

- name :  ํ•„๋“œ์™€ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ์ด๋ฆ„ (default. ๊ฐ์ฒด์˜ ํ•„๋“œ ์ด๋ฆ„)

- nullable (DDL) : null ๊ฐ’์˜ ํ—ˆ์šฉ ์—ฌ๋ถ€ ์„ค์ •, false ์„ค์ • ์‹œ not null (default. true) 

                            @Colunm ์‚ฌ์šฉ ์‹œ nullable = false ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ 

- unique (DDL) : @Table์˜ uniqueConstraints์™€ ๊ฐ™์ง€๋งŒ ํ•œ ์ปฌ๋Ÿผ์— ๊ฐ„๋‹จํžˆ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์ ์šฉ

- columnDefinition (DDL) : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปฌ๋Ÿผ ์ •๋ณด๋ฅผ ์ง์ ‘ ์ค„ ์ˆ˜ ์žˆ์Œ.

                                            (default. ํ•„๋“œ์˜ ์ž๋ฐ” ํƒ€์ž…๊ณผ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด ์ ์ ˆํ•œ ์ปฌ๋Ÿผ ํƒ€์ž…์„ ์ƒ์„ฑ)

- length (DDL) : ๋ฌธ์ž ๊ธธ์ด ์ œ์•ฝ์กฐ๊ฑด, String ํƒ€์ž…์—๋งŒ ์‚ฌ์šฉ (default. 255)

- precistion, scale(DDL) : BigDecimal, BigInteger ํƒ€์ž…์—์„œ ์‚ฌ์šฉ, ์•„์ฃผ ํฐ ์ˆซ์ž๋‚˜ ์ •๋ฐ€ํ•œ ์†Œ์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋งŒ ์‚ฌ์šฉ

(default. precistion= 19, scale = 2 )

@JoinColumn

: ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ

 

 ์†์„ฑ

- name :  ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ด๋ฆ„ (default. ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค ์ปฌ๋Ÿผ๋ช…)

- foreignKey (DDL) : ์™ธ๋ž˜ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์†์„ฑ์€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

- referencedColumnName : ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช… ( ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค ์ปฌ๋Ÿผ๋ช… )

unique nullable insertable updatable columnDefinition table ์€ @Column ์†์„ฑ๊ณผ ๊ฐ™๋‹ค.

@Temporal

: ๋‚ ์งœ ํƒ€์ž… ๋งคํ•‘(java.util.Date, java.util.Calendar)

: LocalDate, LocalDateTime์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ƒ๋žต๊ฐ€๋Šฅ (์ตœ์‹  ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์ง€์›)

 ์†์„ฑ

value 

TemporalType.DATE : ๋‚ ์งœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค date ํƒ€์ž…๊ณผ ๋งคํ•‘ (ex:2013-10-11)

TemporalType.TIME : ์‹œ๊ฐ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค time ํƒ€์ž…๊ณผ ๋งคํ•‘ (ex:11:11:11)

TemporalType.TIMESTAMP : ๋‚ ์งœ์™€ ์‹œ๊ฐ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค timestamp ํƒ€์ž…๊ณผ ๋งคํ•‘ (ex:2013-10-11 11:11:11)

@Enumerated

: ์ž๋ฐ” enum ํƒ€์ž… ๋งคํ•‘

 

 ์†์„ฑ

value (ORDINAL ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค)

EnumType.ORDINAL : enum ์ˆœ์„œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค. (default)

EnumType.STRING : enum ์ด๋ฆ„์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค. 

@Lob

: CLOB(๋งคํ•‘ํ•˜๋Š” ํ•„๋“œ ํƒ€์ž…์ด ๋ฌธ์ž String, char[], java.sql.CLOB), BLOB(byte[], java.sql.BLOB) ๋งคํ•‘

: @Lob์—๋Š” ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ด ์—†๋‹ค.

@Transient

: ํŠน์ • ํ•„๋“œ๋ฅผ ์ปฌ๋Ÿผ์— ๋งคํ•‘ํ•˜์ง€ ์•Š์Œ (๋งคํ•‘๋ฌด์‹œ)

: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ, ์กฐํšŒ ํ•˜์ง€ ์•Š์Œ

: ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์ž„์‹œ๋กœ ๊ฐ’์„ ๋ณด๊ด€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

@Transient
private Integer temp;

 

๊ธฐ๋ณธ ํ‚ค ๋งคํ•‘  @Id @GeneratedValue

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Id

: JPA ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์˜ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•  ํ•„๋“œ์— ์ ์šฉ

 

  ์ง์ ‘ ํ• ๋‹น : ๊ธฐ๋ณธํ‚ค๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง์ ‘ ํ• ๋‹น

     - em.persist()๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง์ ‘ ์‹๋ณ„์ž ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•จ. ์‹๋ณ„์ž ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ 

@GeneratedValue

๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ ์ „๋žต 

   

    • ์ž๋™ ์ƒ์„ฑ : ๋Œ€๋ฆฌํ‚ค ์‚ฌ์šฉ๋ฐฉ์‹ 

       - IDENTITY : ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ์„ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์œ„์ž„, MYSQL (=AUTO_INCREMENT)

                           : em.persist() ์‹œ์ ์— ์ฆ‰์‹œ INSERT SQL ์‹คํ–‰ํ•˜๊ณ  DB์—์„œ ์‹๋ณ„์ž ์กฐํšŒ

@Entity
public class Member{
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

       - SEQUENCE: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ํ• ๋‹น,  @SequenceGenerator 

                                ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค์—์„œ ์‹๋ณ„์ž ๊ฐ’์„ ํš๋“ํ•œ ํ›„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ 

                                 ์œ ์ผํ•œ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑ (Oracle, PostgreSQL, DB2, H2)

       - TABLE: ํ‚ค ์ƒ์„ฑ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉ @TableGenerator

                       ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ” ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์— ์ด๋ฆ„๊ณผ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ปฌ๋Ÿผ์„ ๋งŒ๋“ค์–ด 

                       ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ์ „๋žต, ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉ ๊ฐ€๋Šฅ 

       - AUTO : ์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋”ฐ๋ผ ๋ฐฉ์‹์„ ์ž๋™์œผ๋กœ ์„ ํƒ (Default)

                      Ex) Oracle ์„ ํƒ ์‹œ SEQUNCE, MySQL  ์„ ํƒ ์‹œ IDENTITY ์‚ฌ์šฉ 

 

์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘  @ManyToOne @OneToMany

@ManyToOne

: ๋‹ค๋Œ€์ผ ๊ด€๊ณ„ ๋งคํ•‘

 

 ์†์„ฑ

optional : false๋กœ ์„ค์ •ํ•˜๋ฉด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•ญ์ƒ ์žˆ์–ด์•ผ ํ•œ๋‹ค. (default. TRUE)

fetch : ๊ธ€๋กœ๋ฒŒ ํŒจ์น˜ ์ „๋žต์„ ์„ค์ •ํ•œ๋‹ค. ( @ManyToOne=FetchType.EAGER  @OneToMany=FetchType.LAZY )

cascade : ์˜์†์„ฑ ์ „์ด ๊ธฐ๋Šฅ

targetEntity : ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ ํƒ€์ž… ์ •๋ณด๋ฅผ ์„ค์ •, ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด๋„ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž… ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ O

@OneToMany

: ์ผ๋Œ€๋‹ค ๊ด€๊ณ„ ๋งคํ•‘

 

 ์†์„ฑ

mappedBy : ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ ํ•„๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.


@Aspect

: ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ Aspect๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค ์ž„์„ ๋ช…์‹œ 

 

    • Aspect : ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™” ํ•œ ๊ฒƒ. ์ฃผ๋กœ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™” ํ•จ 

@PersistenceContext

: ์—”ํ‹ฐํ‹ฐ ๋ฉ”๋‹ˆ์ €( EntityManager ) ์ฃผ์ž…

@PersistenceUnit

: ์—”ํ‹ฐํ‹ฐ ๋ฉ”๋‹ˆํ„ฐ ํŒฉํ† ๋ฆฌ( EntityManagerFactory ) ์ฃผ์ž…

 

 

 

 

Comments