2022 01 26 - oneso123456789/2022 GitHub Wiki

Other

RedirectAttributes์—์„œ ์ž๊พธ s๋ฅผ ๋ˆ„๋ฝํ•จ s๊ฐ€ ๋ถ™์–ด์•ผํ•จ
๊ทธ๋ฆฌ๊ณ  ์ €๋ฒˆ์— DTO๋ฅผ ๊ณต๋ถ€ํ• ๋•Œ DTO์˜ ๋‹ค๋ฅธ์ด๋ฆ„์ด VO๋ผ๊ณ  ํ–ˆ์ง€๋งŒ ์ •ํ™•ํžˆ๋Š” ๋‹ค๋ฅธ๊ฒƒ์ž„
๋˜ํ•œ ์œ„ํ‚ค๋ง๊ณ  gitbook์„ ์ด์šฉํ•ด๋ณผ์ง€๋„ ๊ณ ๋ฏผํ•ด๋ด์•ผํ•จ

VO

  • ๋ฐ์ดํ„ฐ ๊ทธ ์ž์ฒด๋กœ ์˜๋ฏธ ์žˆ๋Š” ๊ฒƒ์„ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์ด๋‹ค.

  • DTO์™€ ๋™์ผํ•œ ๊ฐœ๋…์ด๋‚˜ ์ฐจ์ด์ ์€ Readโ€“Only ์†์„ฑ ๊ฐ์ฒด์ด๋‹ค.

  • ๊ฐ„๋‹จํ•œ ๋…๋ฆฝ์ฒด( Entity )๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ž‘์€ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ๊ด€๊ณ„๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€์‘๋˜๋Š” ์ž๋ฐ”ํด๋ž˜์Šค์ด๋‹ค.

  • ํ˜•ํƒœ๋Š” Database๋ ˆ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•„๋“œ๋“ค์„ VO์˜ Attribute๋กœ ํ•˜๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š” Getter์™€ Setter ๋ฉ”์†Œ๋“œ์˜ ์กฐํ•ฉ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ํ˜•์„ฑ๋˜์–ด์ง„ ํด๋ž˜์Šค์ด๋‹ค.

  • ๊ฑฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง€๊ณ  equals()๋กœ ๋น„๊ตํ•  ๋•Œ ๊ฐ์ฒด์˜ ๋ชจ๋“  ๊ฐ’์„ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.

DTO

  • ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

  • VO์™€ ๋™์ผํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ํ•„์š”ํ•˜๋‹ค.

  • VO์™€ ๋น„๊ต๋ฅผ ํ•˜์—ฌ ๋ณด๋ฉด DTO๋Š” ๊ฐ™์€ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

  • Layer๊ฐ„์˜ ํ†ต์‹  ์šฉ๋„๋กœ ์˜ค๊ฐ€๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

  • ํ˜„์žฌ์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ๋ฆ„์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

  • ์„œ๋ฒ„ ์ธก : Database Column Data -> DTO -> API(JSON or XML) -> Client

  • ํด๋ผ์ด์–ธํŠธ ์ธก : Server -> API(JSON or XML) -> DTO -> View or Local Database System

VO์™€ DTO ์ •๋ฆฌ :

  • VO : ์‚ฌ์šฉ ๋˜๋Š” ๊ฐ’์ด ๊ฐ์ฒด๋กœ ํ‘œํ˜„ ๋˜๋ฉฐ, ๊ฐ’ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

  • DTO : ๋ฐ์ดํ„ฐ์˜ ์ „์†ก์„ ์œ„ํ•œ ๊ฐ์ฒด์ด๋ฉฐ, ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง๊นŒ์ง€ ๋‹ด์•„์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

์ถœ์ฒ˜: https://ijbgo.tistory.com/9 [ํ•œ๋Ÿ‰ ๊ฐœ๋ฐœ์ž]

WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/] in DispatcherServlet with name 'appServlet'

์˜ค๋ฅ˜๊ฐ€ ์•ผ๊ธฐ๋จ 2022-01-26 23์‹œ12๋ถ„
์•„๋งˆ servlet-conxtext.xmlํŒŒ์ผ์„ ๋ณด๋˜์ค‘ ์˜๋„์น˜ ์•Š๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธด๊ฑฐ ๊ฐ™์Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ servlet-context.xmlํŒŒ์ผ์— ์ŠคํŽ˜์ด์Šค๋ฐ”๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๊ณต๋ฐฑ๋ฌธ์ž๋ฅผ ๋„ฃ์–ด์ค€ํ›„ ๋‹ค์‹œ ์ง€์šดํ›„ ์ €์žฅํ•˜๋‹ˆ ํ•ด๊ฒฐํ•จ

Model์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ž

RedirectAttribute

Model ํƒ€์ž…๊ณผ ๋”๋ถˆ์–ด์„œ ์Šคํ”„๋ง MVC๊ฐ€ ์ž๋™์œผ๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ํƒ€์ž… ์ค‘์—๋Š” RedirectAttribute ํƒ€์ž…์ด ์กด์žฌํ•จ
RedirectAttribute๋Š” ์กฐ๊ธˆ ํŠน๋ณ„ํ•˜๊ฒŒ๋„ ์ผํšŒ์„ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ
RedirectAttribute๋Š” ๊ธฐ์กด์— Servlet์—์„œ๋Š” response.sendRedirect()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋™์ผํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ

Servlet & Spring MVC์—์„œ ์‚ฌ์šฉ๋ฒ•

Servlet์—์„œ redirect๋ฐฉ์‹

    response.sendRedirect("/home?name=crow&age=26);

์Šคํ”„๋ง MVC๋ฅผ ์ด์šฉํ•˜๋Š” redirect์ฒ˜๋ฆฌ

  rttr.addFlashAttribute("name", "crow");
    rttr.addFlashAttribute("age", 26);

    return "redirect:/";

RedirectAttribute๋Š” Model๊ณผ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ , addFlashAttribute(์ด๋ฆ„,๊ฐ’) ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํ™”๋ฉด์— ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ณ 
๋‹ค์Œ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•จ

Controller์˜ ๋ฆฌํ„ด ํƒ€์ž…

์Šคํ”„๋ง MVC์˜ ๊ตฌ์กฐ๊ฐ€ ๊ธฐ์กด์˜ ์ƒ์†๊ณผ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ•œ ์ดํ›„์— ๊ฐ€์žฅ ํฐ ๋ณ€ํ™” ์ค‘ ํ•˜๋‚˜๋Š” ๋ฆฌํ„ด ํƒ€์ž…์ด ์ž์œ ๋กœ์›Œ์ง„ ๋ถ€๋ถ„์ž„


Controller์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌํ„ด ํƒ€์ž…์€ ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

  • String: jsp๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” jsp ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์™€ ํŒŒ์ผ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•จ
  • void: ํ˜ธ์ถœํ•˜๋Š” URL๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ jsp๋ฅผ ์˜๋ฏธํ•จ
  • VO, DTO ํƒ€์ž…:์ฃผ๋กœ JSON ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ
  • ResponseEntity ํƒ€์ž…: response ํ• ๋•Œ Http ํ—ค๋” ์ •๋ณด์™€ ๋‚ด์šฉ์„ ๊ฐ€๊ณตํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ
  • Model, ModelAndView: Model๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ™”๋ฉด๊นŒ์ง€ ๊ฐ™์ด ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•จ(์ตœ๊ทผ์—๋Š” ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ 2018๋…„๋„ ๊ธฐ์ค€์ž„ 2022๋…„๋„์—” ๋ชจ๋ฆ„)
  • HttpHeaders: ์‘๋‹ต์— ๋‚ด์šฉ ์—†์ด Http ํ—ค๋” ๋ฉ”์‹œ์ง€๋งŒ ์ „๋‹ฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ

void ํƒ€์ž…

๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด ํƒ€์ž…์„ void๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น URL์˜ ๊ฒฝ๋กœ ๊ทธ๋ž˜๋„ jsp ํŒŒ์ผ์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•จ

Controller์— ex05() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

๋”ฑํžˆ ์„ค๋ช…ํ•  ๋ถ€๋ถ„์—†์ด @GetMapping์„ "/ex05"๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ํ›„ log.info๋กœ /ex05๋ผ๋Š” ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ์คŒ
๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ ‘์†์‹œ 404์—๋Ÿฌ๊ฐ€ ํ‘œ์‹œ๋จ ์ด์œ ๋Š” 'WEB-INF/views/sample/ex05.jsp`๊ฒฝ๋กœ์— ex05ํŒŒ์ผ์ด ์—†๊ธฐ๋•Œ๋ฌธ์ž„
์ด๊ฒƒ์€ servlet-context.xml์˜ ์•„๋ž˜์˜ ์„ค์ •๊ณผ ๊ฐ™์ด ๋งž๋ฌผ๋ ค URL ๊ฒฝ๋กœ๋ฅผ View๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊น€

servlet-context.xml์ผ๋ถ€

  <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" /> (prefix๋Š” ์ ‘๋‘์‚ฌ)
    <beans:property name="suffix" value=".jsp" />  (suffix๋Š” ์ ‘๋ฏธ์‚ฌ)
  </beans:bean>

String ํƒ€์ž…

void ํƒ€์ž…๊ณผ ๋”๋ถˆ์–ด์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ String ํƒ€์ž…์€
์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค„ ํ•„์š”๊ฐ€ ์žˆ์„๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
if~ else์™€ ๊ฐ™์€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ
์ผ๋ฐ˜์ ์œผ๋กœ String ํƒ€์ž…์€ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ JSP ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์˜๋ฏธํ•จ
๋˜ํ•œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๊ธฐ๋ณธ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ HomeController์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด String์„ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•จ
String ํƒ€์ž…์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

  • redirect: ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ
  • forward: ํฌ์›Œ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ

HomeController์˜ ์ผ๋ถ€

  @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model){
      logger.info("Welcome home! the client locale is {}.", locale);

      Date date = new Date();
      DateFormat dateformat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

      String formattedDate = dateFormat.format(date);

      model.addattribute("serverTime", formattedDate );

      return "home";
}

home ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Locale์™€ Model๋กœ ๊ทธ์ค‘ Locale๋Š” ์ง€์—ญ์˜ ์–ธ์–ด,๋‚˜๋ผ๋“ฑ์„ ๋‹ด๊ณ ์žˆ๋Š” ์ •๋ณด์ž„
logger.info๋ฅผ ์ด์šฉํ•ด์„œ ๋กœ๊ทธ์— ํ™˜์˜ํ•œ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊ธฐ๋Š”๋Œ€ ์ด๋•Œ ์‚ฌ์šฉํ•ด์„œ ๋‚˜๋ผ๋ฅผ ํ‘œ์‹œํ•ด์คŒ
INFO : com.crow.controller.HomeController - Welcome home! The client locale is ko_KR.

๋˜ํ•œ ๋‚ ์งœ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ Date์™€ DateFormat์„ ์‚ฌ์šฉํ•จ ํฌ๋งท์€ getDateTimeInstance๋ฅผ ์ด์šฉํ•ด์„œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„๊นŒ์ง€ ๊ฐ€์ ธ์™€์ค€๋‹ค ๋˜ํ•œ ๋‚ ์งœ๋ฅผ ๋กฑ ํ˜•ํƒœ๋กœ ์‹œ๊ฐ„์—ญ์‹œ ๋กฑ ํ˜•ํƒœ๋กœ ํ•ด์ฃผ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋กœ์ปฌ์„ ํ•œ๊ตญ์œผ๋กœ ํ‘œ์‹œํ•ด์ค€๋‹ค
(๋‚ ์งœ๋งŒ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด getDateInstance๋ฅผ ์ด์šฉ ์‹œ๊ฐ„๋งŒ ๊ฐ€์ ธ์˜ฌ๊บผ๋ฉด getTimeInstance)

๋‚ ์งœํ‘œ์‹œ ์ถ”๊ฐ€๋‚ด์šฉ

DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale)
The time on the server is 2022๋…„ 1์›” 27์ผ ๋ชฉ์š”์ผ ์˜ค์ „ 2์‹œ 06๋ถ„ 55์ดˆ KST.

DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
The time on the server is 2022๋…„ 1์›” 27์ผ (๋ชฉ) ์˜ค์ „ 2์‹œ 07๋ถ„ 55์ดˆ.

DateFormat.FULL๊ณผ DateFormat.LONG์€ ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์ธ LONG์„ ์‚ฌ์šฉํ•ด๋„ ๋ณ„๋กœ ๋ถˆํŽธํ•œ์ ์€ ์—†์–ด๋ณด์ธ๋‹ค

๋˜ํ•œ ์ด ํฌ๋งท์„ Stringํ˜•์˜ ๋ณ€์ˆ˜ formattedDate์— ๋„ฃ์–ด์ค˜์„œ model์— addAttribute๋กœ'serverTime'์†์„ฑ์— ๋„ฃ์–ด์ค€๋‹ค.
๊ทธ๋’ค ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ "home"์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค
home() ๋ฉ”์„œ๋“œ๋Š” 'home'์ด๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๋กœ๋Š” '/WEB-INF/views/home.jsp'๊ฒฝ๋กœ๊ฐ€ ๋จ
์ฐธ๊ณ :https://promobile.tistory.com/197

๊ฐ์ฒด ํƒ€์ž…

Controller์˜ ๋ฉ”์„œ๋“œ ๋ฆฌํ„ด ํƒ€์ž…์„ VO(Value Object)๋‚˜ DTO(Data Transfer Objcet)ํƒ€์ž… ๋“ฑ
๋ณตํ•ฉ์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ๋Š” ์ฃผ๋กœ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ
์šฐ์„  ์ด๋ฅผ ์œ„ํ•ด์„œ jackson-databind ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ pom.xml์— ์ถ”๊ฐ€ํ•จ

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด์„œ ์‚ดํŽด๋ณด๋ฉด(๊ฐœ๋ฐœ์ž ๋„๊ตฌ ๋„คํŠธ์›Œํฌ์ชฝ) ์„œ๋ฒ„์—์„œ ์ „์†กํ•˜๋Š” MIME ํƒ€์ž…์ด Content-Type: application/json;charset=UTF-8์œผ๋กœ ์ฒ˜๋ฆฌ๋จ
๋งŒ์ผ Jackson-databind ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด 500 internal Server Error๋ฅผ ๋ณด๊ฒŒ๋จ
์Šคํ”„๋ง MVC๋Š” ๋ฆฌํ„ด ํƒ€์ž…์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ JSON์€ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋ฏ€๋กœ ๋ณ„๋„์˜ ์„ค์ •์ด ํ•„์š”๊ฐ€ ์—†์Œ
์Šคํ”„๋ง 3๋ฒ„์ „๊นŒ์ง€๋Š” ๋ณ„๋„์˜ Converter๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Œ

pom.xml์— jackson-databind ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

  <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.4</version>
  </dependency>

2.9.4 ๋ฒ„์ „์€ ๋งŽ์€ ๋ณด์•ˆ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ผ๋‹จ ์˜ˆ์ œ์™€ ๊ฐ™์€๊ฒฐ๊ณผ๋ฅผ ๊ฐ–์ถ”๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋ฏ€๋กœ ์ผ๋‹จ ์‚ฌ์šฉํ•˜๊ธฐ๋กœํ•จ

SampleController์— ex06()๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

    @GetMapping("/ex06")
    public @ResponseBody SampleDTO ex06() {
        log.info("ex06......");
        SampleDTO dto = new SampleDTO();
        dto.setAge(26);
        dto.setName("Crow");
        
        return dto;
        
    }

๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ดํƒ€์ž…์€ SampleDTO๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์—†์Œ
SampleDTO์•ž์— @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ ์–ธํ•ด ์ค˜์•ผ์ง€๋งŒ JSONํ˜•ํƒœ๋กœ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ/ex06์— JSONํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ
๋ˆ„๋ฝ์‹œ ๊ทธ๋ƒฅ ์–ด๊น€์—†์ด 404 ์—๋Ÿฌํ‘œ์‹œ๊ฐ€๋œธ
URL๋กœ ํ˜ธ์ถœ์‹œ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  SampleDTO๋ฅผ importํ•ด์„œ set๋ฉ”์„œ๋“œ๋กœ age์™€ name์— ๊ฐ’์„ ๋„ฃ์–ด์คŒ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ