[Spring]Annotation


Annotation ์ด๋ž€?



Annotation(@)์€ ์‚ฌ์ „์  ์˜๋ฏธ๋กœ๋Š” ์ฃผ์„์ด๋ผ๋Š” ๋œป์ด๋‹ค. ์ž๋ฐ”์—์„œ Annotation์€ ์ฝ”๋“œ ์‚ฌ์ด์— ์ฃผ์„์ฒ˜๋Ÿผ ์“ฐ์ด๋ฉฐ ํŠน๋ณ„ํ•œ ์˜๋ฏธ, ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. meta data : ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ)

๋‹ค์Œ์€ ์–ด๋…ธํ…Œ์ด์…˜์˜ ์šฉ๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฌธ๋ฒ• ์—๋Ÿฌ๋ฅผ ์ฒดํฌํ•˜๋„๋ก ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํˆด์ด ๋นŒ๋“œ๋‚˜ ๋ฐฐ์น˜์‹œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์‹คํ–‰์‹œ(๋Ÿฐํƒ€์ž„์‹œ)ํŠน์ • ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋„๋ก ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•œ๋‹ค.
  2. ํด๋ž˜์Šค์— ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฐฐ์น˜ํ•œ๋‹ค.
  3. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ค‘์— Reflection์„ ์ด์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํš๋“ํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์‹ค์‹œํ•œ๋‹ค.



Reflection ์ด๋ž€?


Reflection์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘์— ์ž์‹ ์˜ ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ๊ฒ€์‚ฌํ•˜๊ณ , ์กฐ์‚ฌํ•˜๊ณ , ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Reflection์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ๋‹ค๋ฅธ ํฌ๋งท์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ†ต์‹ ์„ ์œ„ํ•ด serialization(์ง๋ ฌํ™”)๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , bundling์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋„๋ก ๋„์™€์ค€๋‹ค.

Java์™€ ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ Reflection์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ธํ„ฐํŽ˜์ด์Šค, ํ•„๋“œ, ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ์•Œ์ง€ ๋ชปํ•ด๋„ ์‹คํ–‰ ์ค‘์— ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ํ•„๋“œ ๋ฐ ๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šคํ™” ๋ฐ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•œ๋‹ค.

Java์™€ ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ Reflection์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉค๋ฒ„ ์ ‘๊ทผ ๊ฐ€๋Šฅ์„ฑ ๊ทœ์น™์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.


[EX] reflection์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋“œ ํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํด๋ž˜์Šค์—์„œ private ํ•„๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.


Spring์—์„œ BeanFactory๋ผ๋Š” Container์—์„œ ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๋•Œ ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์œ ์—ฐ์„ฑ์žˆ๋Š” ๋™์ž‘์„ ์œ„ํ•ด ์“ฐ์ธ๋‹ค.

Annotation ์ž์ฒด๋Š” ์•„๋ฌด๋Ÿฐ ๋™์ž‘์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ ํ‘œ์‹์ผ ๋ฟ์ด์ง€๋งŒ, Reflection์„ ์ด์šฉํ•˜๋ฉด Annotation์˜ ์ ์šฉ ์—ฌ๋ถ€์™€ ์—˜๋ฆฌ๋จผํŠธ ๊ฐ’์„ ์ฝ๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Class์— ์ ์šฉ๋œ Annotation ์ •๋ณด๋ฅผ ์ฝ์œผ๋ ค๋ฉด java.lang.Class๋ฅผ ์ด์šฉํ•˜๊ณ  ํ•„๋“œ, ์ƒ์„ฑ์ž, ๋ฉ”์†Œ๋“œ์— ์ ์šฉ๋œ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ ์ฝ์œผ๋ ค๋ฉด Class์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด java.lang.reflect ํŒจํ‚ค์ง€์˜ ๋ฐฐ์—ด์„ ์–ป์–ด์•ผ ํ•œ๋‹ค.

Class.forName(), getName(), getModifier(), getFields() getPackage()๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋กœ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.


Reflection์„ ์ด์šฉํ•˜๋ฉด Annotation ์ง€์ •๋งŒ์œผ๋กœ๋„ ์›ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

// Without reflection
Foo foo = new Foo();
foo.hello();
// With reflection
Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
// Alternatively: Object foo = Foo.class.newInstance();
Method m = foo.getClass().getDeclaredMethod("hello", **new** Class<?>[0]);
m.invoke(foo);

@RestController

  • @Controller ์™€ @ResponseBody ๋ฅผ ํ•ฉ์นœ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ๋ฅผ JSON ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

@RequestMapping

  • ์š”์ฒญ URL์„ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
  • Controller๋‚˜ Controller์˜ method์— ์ ์šฉํ•œ๋‹ค.
  • ์š”์ฒญ์„ ๋ฐ›๋Š” ํ˜•์‹์ธ GET, POST, PATCH, PUT, DELETE ๋ฅผ ์ •์˜ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. (์ง€์ • ์•ˆํ•  ์‹œ GET)

@Bean

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— Bean์„ ๋“ฑ๋กํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

  • @Bean
    
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ œ์–ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • @Component
    
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@Autowired

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

@Configuration

  • ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ํ™˜๊ฒฝ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ํด๋ž˜์Šค์— ์ •์˜๋œ @Bean์ด ์ ์šฉ๋œ ๋ฉ”์†Œ๋“œ๋Š” @Autowired๋ฅผ ํ†ตํ•ด์„œ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ConfigurationProperties

  • ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ์„ ์ฝ์–ด์™€์„œ ํ•ด๋‹น ๊ฐ’๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

@Transactional

  • ํ•ด๋‹น ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์†Œ๋“œ์— ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉ์‹œ์ผœ ์ค๋‹ˆ๋‹ค.
  • DB์— ์•ก์„ธ์Šคํ•˜๋Š” ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ๋“ค์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋กค๋ฐฑ ์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

@Controller

  • Presentation Layer
  • ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@Service

  • Service Layer
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@Repository

  • Persistence Layer
  • DB์— ์•ก์„ธ์Šคํ•˜๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (DB์ ‘๊ทผํ•˜๋Š” Method๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” class์—์„œ ์‚ฌ์šฉ(DAO))

@ExceptionHandler

  • ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@ControllerAdvice

  • ์ „์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋“ค์„ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@ComponentScan

  • @Component์™€ @Service, @Repository, @Controller, @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค Bean๋“ค์„ ์ฐพ์•„์„œ Context์— bean๋“ฑ๋ก์„ ํ•ด์ฃผ๋Š” Annotation์ด๋‹ค.
  • @Component Annotation์ด ์žˆ๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•˜์—ฌ bean ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ

  • ApplicationContext.xml์— <bean id="jeongpro" class="jeongpro" /> ๊ณผ ๊ฐ™์ด xml์— bean์„ ์ง์ ‘๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ  ์œ„์™€ ๊ฐ™์ด Annotation์„ ๋ถ™์—ฌ์„œ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

  • base-package๋ฅผ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ํŒจํ‚ค์ง€ ์•„๋ž˜์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ฐพ๊ณ  ๊ทธ ๊ณผ์ •์„ spring-context-๋ฒ„์ „(4.3.11.RELEASE).jar์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • Spring์—์„œ @Component๋กœ ๋‹ค ์“ฐ์ง€ ์•Š๊ณ  @Repository, @Service, @Controller๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ์˜ˆ๋ฅผ๋“ค์–ด @Repository๋Š” DAO์˜ ๋ฉ”์†Œ๋“œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” unchecked exception๋“ค์„ ์Šคํ”„๋ง์˜ DataAccessException์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๋˜ํ•œ ๊ฐ€๋…์„ฑ์—์„œ๋„ ํ•ด๋‹น ์• ๋…ธํ…Œ์ด์…˜์„ ๊ฐ–๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋‹จ ๋ฒˆ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋˜๋Š” Bean์˜ ์ด๋ฆ„์€ ํด๋ž˜์Šค์˜ ์ฒซ๋ฌธ์ž๊ฐ€ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๋€ ์ด๋ฆ„์ด ์ž๋™์ ์šฉ๋œ๋‹ค. HomeController -> homeController

@Controller ์™€ @RestController ์˜ ์ฐจ์ด

  • @Controller API์™€ view๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค. ๋Œ€์‹  API ์„œ๋น„์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” @ResponseBody๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. view(ํ™”๋ฉด) return์ด ์ฃผ๋ชฉ์ ์ด๋‹ค.
  • @RestController view๊ฐ€ ํ•„์š”์—†๋Š” API๋งŒ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. Spring 4.0.1๋ถ€ํ„ฐ ์ œ๊ณต @RequestMapping ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ @ResponseBody ์˜๋ฏธ๋ฅผ ๊ฐ€์ •ํ•œ๋‹ค. data(json, xml ๋“ฑ) return์ด ์ฃผ๋ชฉ์ ์ด๋‹ค.

์ฆ‰, @RestController = @Controller + @ResponseBody ์ด๋‹ค.

@ModelAttribute

  • view์—์„œ ์ „๋‹ฌํ•ด์ฃผ๋Š” parameter๋ฅผ Class(VO/DTO)์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ binding ํ•ด์ฃผ๋Š” Annotation์ด๋‹ค.

  • binding ๊ธฐ์ค€์€ <input name="id" /> ์ฒ˜๋Ÿผ ์–ด๋–ค ํƒœ๊ทธ์˜ name๊ฐ’์ด ํ•ด๋‹น Class์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ช…๊ณผ ์ผ์น˜ํ•ด์•ผํ•˜๊ณ  set method๋ช…๋„ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค.

class Person{

String id;

public void setId(String id){ this.id = id;}
public String getId(){ return this.id }
}

@Controller
@RequestMapping("/person/*")
public class PersonController{
	@RequestMapping(value = "/info", method=RequestMethod.GET)
    	//view์—์„œ myMEM์œผ๋กœ ๋˜์ ธ์ค€ ๋ฐ์ดํ„ฐ์— ๋‹ด๊ธด id ๋ณ€์ˆ˜๋ฅผ Personํƒ€์ž…์˜ person์ด๋ผ๋Š” ๊ฐ์ฒด๋ช…์œผ๋กœ ๋ฐ”์ธ๋”ฉ.
	public void show(@ModelAttribute("myMEM") Person person, Model model)
	{ model.addAttribute(service.read(person.getId())); }
}

@RequestBody

  • ์š”์ฒญ์ด ์˜จ ๋ฐ์ดํ„ฐ(JSON์ด๋‚˜ XMLํ˜•์‹)๋ฅผ ๋ฐ”๋กœ Class๋‚˜ model๋กœ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ Annotation์ด๋‹ค.

  • POST๋‚˜ PUT, PATCH๋กœ ์š”์ฒญ์„ ๋ฐ›์„๋•Œ์—, ์š”์ฒญ์—์„œ ๋„˜์–ด์˜จ body ๊ฐ’๋“ค์„ ์ž๋ฐ” ํƒ€์ž…์œผ๋กœ ํŒŒ์‹ฑํ•ด์ค€๋‹ค.

  • HTTP POST ์š”์ฒญ์— ๋Œ€ํ•ด request body์— ์žˆ๋Š” request message์—์„œ ๊ฐ’์„ ์–ป์–ด์™€ ๋งคํ•‘ํ•œ๋‹ค. RequestData๋ฅผ ๋ฐ”๋กœ Model์ด๋‚˜ ํด๋ž˜์Šค๋กœ ๋งคํ•‘ํ•œ๋‹ค.

์ด๋ฅผํ…Œ๋ฉด JSON ์ด๋‚˜ XML๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ messageConverter๋กœ ์ฝ์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ POJO ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ „์ฒด๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

@ResponseBody

  • HttpMessageConverter๋ฅผ ์ด์šฉํ•˜์—ฌ JSON ํ˜น์€ xml ๋กœ ์š”์ฒญ์— ์‘๋‹ตํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Annotation์ด๋‹ค.
  • view๊ฐ€ ์•„๋‹Œ JSON ํ˜•์‹์˜ ๊ฐ’์„ ์‘๋‹ตํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Annotation์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๋ฉด ๊ทธ ๊ฐ’์„ http response header๊ฐ€ ์•„๋‹Œ response body์— ๋“ค์–ด๊ฐ„๋‹ค.

  • ์ด๋ฏธ RestController Annotation์ด ๋ถ™์–ด ์žˆ๋‹ค๋ฉด, ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ—ˆ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋‹จ์ˆœ ์ปจํŠธ๋กค๋Ÿฌ๋ผ๋ฉด, HttpResponse๋กœ ์‘๋‹ต ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

  • ๋งŒ์•ฝ ๊ฐ์ฒด๋ฅผ returnํ•˜๋Š” ๊ฒฝ์šฐ JACKSON ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด ์ „์†ก๋œ๋‹ค.

  • context์— ์„ค์ •๋œ viewResolver๋ฅผ ๋ฌด์‹œํ•œ๋‹ค๊ณ  ๋ณด๋ฉด๋œ๋‹ค.



[์ฐธ๊ณ ]

https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC