MVC ์ํคํ ์ณ ํจํด / 3-Layered ์ํคํ ์ณ ํจํด
Spring Boot์ ์์: (1) ์์กด์ฑ ๊ด๋ฆฌ + (2) ์๋ ์ค์
Spring Boot๋ ๋ณต์กํ ์ค์ ์ ์ต์ํํ๊ณ ๊ฐ๋ฐ์๊ฐ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋๋ก ์ค๊ณ๋ ํ๋ ์์ํฌ์ด๋ค. ์ด๋ React์ CRA(Create-React-App)์ ๋น์ทํ ์ญํ ์ ํ๋ฉฐ, ์ฃผ๋ก ๋ค์ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ค์ ์ ๋๋ค.
1. ์์กด์ฑ ๊ด๋ฆฌ:
- spring-boot-starter-web: ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณต, ๋ด์ฅ๋ Tomcat ์๋ฒ์ ํจ๊ป ์๋ ์ค์ ์ ์ ๊ณต
- spring-boot-starter-security: ์ธ์ฆ, ์ธ๊ฐ, ๊ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- spring-boot-starter-data-jpa: JPA ๋ฐ Hibernate ๊ด๋ จ ์์กด์ฑ
- spring-boot-starter-jdbc: HikariCP ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ JDBC ๊ธฐ๋ฅ ์ ๊ณต
2. ์๋ ์ค์ :
- Spring Boot๋ ๋๋ถ๋ถ์ ์ค์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ ๊ฒฝ ์ธ ๋ถ๋ถ์ ์ค์ฌ์ค๋ค.
- ์ฃผ์ ์๋ ์ค์ :
- @SpringBootApplication: Spring Boot์ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ธํ
๋ฐ ๊ธฐ๋ณธ ์ค์
- @SpringBootConfiguration: @Configuration์ ํตํด ์ถ๊ฐ @Bean ๋ฑ๋ก ๊ฐ๋ฅ
- @EnableAutoConfiguration: ์ฌ์ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ํ ๊ธฐ๋ณธ(Default) ์ค์ ๊ฐ
- @ComponentScan: XML์ด ์๋ @Controller ๋ฑ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ Bean ์์ง ๊ท์น ์ ์
- @SpringBootApplication: Spring Boot์ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ธํ
๋ฐ ๊ธฐ๋ณธ ์ค์
Spring vs Spring Boot
Spring๊ณผ Spring Boot์ ์ฐจ์ด๋ ์ ํต์ ์ธ Spring Framework์ ์ค์ ๊ณผ Spring Boot์ ๊ฐํธํ ์ค์ ๊ฐ์ ์ฐจ์ด์์ ๋ฐ์ํ๋ค.
1. Spring
- WAR (Web Application Archive) ํ์ผ๋ก ์ธ๋ถ WAS(Tomcat ๋ฑ)์ ๋ฐฐํฌ๋๋ค.
- ๋ณ๋์ Tomcat๊ณผ ๊ฐ์ ์๋ฒ์ WAR ํ์ผ์ ๋ฐฐํฌํ๊ณ ์คํํด์ผ ํ๋ฉฐ, ์ค์ ์ด ๋ณต์กํ๋ค.
2. Spring Boot:
- JAR (Java Archive) ํ์ผ๋ก ๋ฐ๋ก ์คํ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋ค.
- ๋ด์ฅ๋ Tomcat ์๋ฒ์ ํจ๊ป ์คํ๋๋ฉฐ, ๋ณ๋์ ์๋ฒ ์ค์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ก ์คํํ ์ ์๋ค.
- Spring Boot๋ JAR ํ์ผ ์คํ๊ณผ ๋์์ ๋ด์ฅ๋ Tomcat ์๋ฒ๋ฅผ ์์ํ๋ฉฐ, ํ๊ฒฝ ์ค์ ์ ํธ๋ฆฌํจ์ ์ ๊ณตํ๋ค.
WAR์ JAR์ ๋ํด์ ์ง๋ ํฌ์คํ ์์๋ ์ธ๊ธํ์๋ค. ํด๋น ๊ธ์ ์ฐธ๊ณ ํ์ (https://1000sang-dev.tistory.com/55)
Spring์ MVC ์ํคํ ์ณ ํจํด
Spring์ ๋ ๊ฐ์ง ์ฃผ์ ์ํคํ ์ฒ ํจํด์ผ๋ก ๊ตฌ์ฑ๋๋ค.
1. MVC ํจํด(Model-View-Controller)
2. 3-Layered ํจํด
Spring ๊ตฌ์กฐ 1) MVC ์ํคํ ์ณ ํจํด : ์์ฒญ์ ๋ฐ๋ฅธ ๋ฐํ์ ์ํ ๋ก์ง
https://1000sang-dev.tistory.com/55
์ด์ ํฌ์คํ ์์ ์ด๋ฏธ ๋ค๋ค๋ ๋ด์ฉ์ด๋ ์ด๋ฒ ํฌ์คํ ์์ ๊ฐ๋จํ๊ฒ ์์ฝํ์๋ฉด
- Front Controller (DispatcherServelt): ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์ ์ ์ ํ Controller๋ก ์ ๋ฌํ๊ณ View์ Model์ ๋ฐํ๋ฐ์ ์ฒ๋ฆฌํ๋ค.
- Controller: ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํ์ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ Model์ ๋ด๋๋ค.
- View: ์ต์ข ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋๋ ํ์ด์ง(HTML ๋๋ JSON ๋ฑ)๋ฅผ ์์ฑํ๋ค.
MVC ์ํคํ ์ณ ๋์ ํ๋ฆ
1. DispatcherServlet: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์ ์ ํ Controller์ ์ ๋ฌํ๋ค.
2. Controller: ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ํ, ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ Model์ ๋ด๊ณ View์ด๋ฆ์ ๋ฐํํ๋ค
3. ViewResolver: Controller์์ ๋ฐํ๋ View ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ํ์ด์ง๋ฅผ ์ฐพ์์ ๋ฐํํ๋ค.
4. View: ์ต์ข ๊ฒฐ๊ณผ ํ์ด์ง๋ฅผ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ๋ค.
Spring MVC ์ํคํ ์ณ ํจํด ์์ธ ์ค๋ช
Spring์ Java ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์ด๋ฉฐ, Java ๊ธฐ๋ฐ WAS์ธ Tomcat์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. Tomcat์ Servlet Container๋ก, Java ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ๋ ํ์ค ๊ธฐ์ ์ธ Servlet์ ํตํด ๋์ํ๋ค.
Front Controller ์ด์ ์ Servlet: Java EE ์์
๊ณผ๊ฑฐ Java EE์์๋ ์์ฒญ๋๋ URL๋ง๋ค ๊ฐ๊ธฐ ๋ค๋ฅธ Servlet์ ๋ง๋ค์ด ๊ฐ๋ฐํ๋ค. ์์๋ก:
- GET /hello ์์ฒญ์ HelloGetServlet์ด ์ฒ๋ฆฌ.
- POST /hello ์์ฒญ์ HelloPostServlet์ด ์ฒ๋ฆฌ.
๊ฐ URL๋ง๋ค ๋ณ๋์ Servlet์ ๋ง๋ค์ด ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ค.
Front Controller๊ฐ ์ ์ฉ๋ Servlet: ํ์ฌ Spring
Spring์์๋ ๋จ์ผ Servlet์ธ DispatcherServlet์ ์ด์ฉํด ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
DispatcherServlet์ ์ผ์ข ์ FrontController ์ญํ ์ ํ์ฌ, ๊ฐ URL๋ง๋ค ๋ค๋ฅธ Servlet์ ์์ฑํ ํ์ ์์ด ํ๋์ Controller์์ URL์ ์ค์ ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ค.
- GET /hello → DispatcherServlet → HelloGetController
- POST /hello → DispatcherServlet → HelloPostController
์ด ํจํด์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ URL ์ฒ๋ฆฌ๊ฐ ์ค์์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ๋ณต์ก์ฑ์ด ํฌ๊ฒ ์ค์ด๋ ๋ค.
์ค์ํ = ์ค์์ฒ๋ฆฌ + ์ค์๊ด๋ฆฌ
์ค์ํ๋ Controller ํธ์ถ๊ณผ View ์์ฑ์ ์ค์์์ ๊ด๋ฆฌํจ์ผ๋ก์จ ์์คํ ์ ๋ณด๋ค ์ผ๊ด์ฑ ์๊ฒ ์ ์งํ๊ณ ์ฒ๋ฆฌ์๋๋ฅผ ๋์ธ๋ค.
1. Contoller ํธ์ถ์ ์ค์ํ:
- HandlerMapping: ์์ฒญ URL์ ๋ง๋ Controller๋ฅผ ์ฐพ์์ค๋ค.
- HandlerAdapter: ์ฐพ์ Controller๋ฅผ ์คํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
2. View ์์ฑ์ ์ค์ํ:
- ViewResolver: Contoller๊ฐ ๋ฐํํ View ์ด๋ฆ์ ๋ง๋ ํ ํ๋ฆฟ์ ์ฐพ์ View๋ฅผ ์์ฑํ๋ค.
- View: Model ๋ฐ์ดํฐ๋ฅผ ํ ํ๋ฆฟ๊ณผ ํฉ์ณ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ค.
Spring - Front Controller ์์ธ ํ๋ฆ
Spring์ Front Controller ํจํด์ ๋ชจ๋ ์์ฒญ์ ํ๋์ ์ค์ํ๋ ์ปจํธ๋กค๋ฌ์ธ DispatcherServlet์ด ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ์ด๋ค. ์ด ๊ณผ์ ์์ Spring์ ์ปจํ ์ด๋์ Tomcat๊ณผ ๊ฐ์ Servlet ์ปจํ ์ด๋๊ฐ ํจ๊ป ์๋ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์ ์ ํ Controller๋ฅผ ์ฐพ์ ์๋ต์ ์์ฑํ๋ค.
1. EC2 ์๋ฒ์์ Tomcat ๊ตฌ๋ ์ 2๊ฐ์ ์ปจํ ์ด๋ ์์ฑ
- Servlet Container(ServletContext): Tomcat์ด ์ฒ์ ๊ตฌ๋๋๋ฉด, ๊ฐ์ฅ ๋จผ์ ServletContext๊ฐ ์์ฑ๋๋ค. ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ํ๊ฒฝ ์ค์ ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ปจํ ์คํธ์ด๋ค.
- Spring Container(ApplicationContext): ServletContextListener๊ฐ ์คํ๋ ํ, Spring์ ApplicationContext๊ฐ ์์ฑ๋๋ค. ApplicationContext๋ Spring์ IoC(Inversion of Control) ์ปจํ
์ด๋๋ก, Bean์ ๊ด๋ฆฌํ๋ค. Spring์ ๋ ๊ฐ์ง ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- Servlet WebApplicationContext: @Controller, HandlerMapping, ViewResolver๋ฑ์ ์น ๊ด๋ จ Bean๋ค์ด ํฌํจ๋ ์ปจํ ์คํธ์ด๋ค. ์ด๋ฅผ Presentation Layer๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค.
- Root WebApplicationContext: @Service, @Repository, @Component ๋ฑ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ด๋ จ Bean๋ค์ด ํฌํจ๋ ์ปจํ ์คํธ์ด๋ค. ์ด๋ฅผ Business Layer ๋๋ Data Access Layer๋ผ๊ณ ๋ถ๋ฅธ๋ค.
2. Tomcat์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด, Tomcat์ ์์ฒญ๋ URL์ ๋ง๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ํ์ธํ๋ค. ๋ง์ฝ ์ ์ ๋ฆฌ์์ค๊ฐ ์๋ค๋ฉด ์ด ์์ฒญ์ Servlet Container๊ฐ ์ฒ๋ฆฌํ๋ค.
3. Servlet Container๊ฐ ์์ฒญ์ ๋ฐ์ Servlet์ ํ ๋น
- Spring์์๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋จ์ผ DispatcherServlet์ ์ฌ์ฉํ๋ค. ์ด Servleet์ด ๋ชจ๋ ์์ฒญ์ ์ค์์์ ์ฒ๋ฆฌํ๋ค.
4. DispatcherServlet์ด ์์ฒญ์ ์ฒ๋ฆฌ
- DispatcherServlet์ Front Controller๋ก์, ์์ฒญ๋ URL์ ๋ง๋ ์ ์ ํ Controller๋ฅผ ์ฐพ์ ์คํํ๋ค.
5. Contoller ํธ์ถ๊ณผ View ์์ฑ์ ์ค์ํ
(1). Contoller ํธ์ถ์ ์ค์ํ:
- HandlerMapping: ์์ฒญ๋ URL์ ๋ง๋ Controller๋ฅผ ์ฐพ์์ฃผ๋ ์ญํ ์ ํ๋ค.
- HandlerAdapter: ์ฐพ์ Contoller๋ฅผ ์คํํ์ฌ, ๊ฒฐ๊ณผ๋ก Model๊ณผ View ์ด๋ฆ์ ๋ฐํํ๋ค. ์ด ๊ณผ์ ์์ ModelAanddView ๊ฐ์ฒด๋ Model๊ณผ String์ผ๋ก ์ด๋ฆ์ ๋ฐํํ ์ ์๋ค.
@RequestMapping(method = RequestMethod.GET, value = "/")
public ModelAndView index() {
ModelAndView mav = new ModelAndView();
mav.addObject("name", "Aaron");
mav.addObject("age", 10);
mav.setViewName("index.html");
return mav;
}
๋๋ ์ต๊ทผ Strping ๋ฐฉ์์ธ Model๊ณผ View ์ด๋ฆ์ ๋ฐํํ๋ ๋ฐฉ๋ฒ:
@RequestMapping(method = RequestMethod.GET, value = "/")
public String index(Model model) {
model.addAttribute("name", "Aaron");
model.addAttribute("age", 10);
return "index.html";
}
(2). View ์์ฑ์ ์ค์ํ:
- ViewResolver: Controller๊ฐ ๋ฐํํ View ์ด๋ฆ์ ๋ง๋ ํ ํ๋ฆฟ ํ์ผ์ ์ฐพ๋๋ค.
- View: ์ฐพ์ ํ ํ๋ฆฟ ํ์ผ์ Model ๋ฐ์ดํฐ๋ฅผ ํฉ์ณ ์ต์ข ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ View๋ฅผ ์์ฑํ๋ค.
- Thymeleaf: Spring์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์๋ฒ์ฌ์ด๋ ํ ํ๋ฆฟ ์์ง์ผ๋ก, HTML ํํ๋ก ํ๋กํ ํ์ ์ ํ์ธํ ์ ์๋ค.
6. ์ต์ข ์ ์ผ๋ก View๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ
- ์ต์ข ์ ์ผ๋ก View ํ ํ๋ฆฟ์ด ๋ ๋๋ง๋๊ณ , ์์ฑ๋ ๊ฒฐ๊ณผ๋ฌผ์ด ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋๋ค. ์ด ๊ณผ์ ์์ Thymeleaf์ ๊ฐ์ ์๋ฒ์ฌ์ด๋ ํ ํ๋ฆฟ ์์ง์ด ์ฌ์ฉ๋ ์๋ ์์ผ๋ฉฐ, React๋ Vue์ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ ์๋ ์๋ค.
Spring ๊ตฌ์กฐ 2) 3-Layered ์ํคํ ์ฒ ํจํด: ์์ธ ๊ตฌํ ์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
Spring์ ๋ฑ 2๊ฐ์ ์ํคํ ์ฒ ํจํด์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค: MVC ์ํคํ ์ฒ ํจํด + 3 ๊ณ์ธต ์ํคํ ์ฒ ํจํด
์ด ํจํด์ ํต์ฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ Presentation, Business, Data Access ๊ณ์ธต์ผ๋ก ์ญํ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
- Presentation Layer: ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๊ด๋ จ๋ ๋ถ๋ถ์ผ๋ก, ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํ๋ฉด์ ์์ฑํ์ฌ ๋ฐํํ๋ ์ญํ . Spring MVC์ @Controller๊ฐ ์ฌ๊ธฐ์ ํด๋นํ๋ค.
- Business Layer: ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๊ณ์ธต์ด๋ค. @Service๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๋ผ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ , ์ด๋ฅผ Presentation Layer์ ์ ๋ฌํ๋ ์ญํ ์ํ๋ค. "Spring ํ๋ ์์ํฌ๋ ๊ฐ๋ฐ์์๊ฒ "๋น์ฆ๋์ค ๊ตฌํ" ์๋ง ์ ๊ฒฝ์ฐ๋๋กํ๋ค"
- Data Access Layer: ์ ํ๋ฆฌ์ผ์ด์
์ ์์์ฑ์ ์ ์งํ๋ ๊ณ์ธต์ผ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ์ฌ CRUD ์์
์ ์ฒ๋ฆฌํ๋ค @Repository๊ฐ ์ฌ๊ธฐ์ ํด๋นํ๋ฉฐ, ๋น์ฆ๋์ค ๊ณ์ธต์์ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์ ์ฅํ๋ ์ญํ ์ ํ๋ค.
- DAO(Data Access Object)์ ์ ์ฌํ ๊ฐ๋ ์ผ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง๊ฒฐ๋ CRUD ํจ์๋ค์ด ํฌํจ๋๋ค. ์๋ฅผ ๋ค์ด EntityManager๋ฅผ ํตํด ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํตํ ์ ์๋ค.
public interface UserDao {
void create(User user);
User read(Long id);
void update(User user);
void delete(String userName);
}
- @Repository๋ DAO๋ฅผ ์บก์ํํ์ฌ ๋ ์ถ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค. ํ์์ ๋ฐ๋ผ DAO์ ์ผ๋ถ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํ๋ค.
public interface UserRepository {
User get(Long id); // ํ์ํ ํจ์๋ง ๊ตฌํํ ์ ์์.
// void add(User user);
// void update(User user);
// void remove(User user);
}
DAO ์ Repository ์ฐจ์ด์
DAO์ Repository ํจํด์ ์ ์ฌํ์ง๋ง ๋ค๋ฅด๋ค. DAO๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ์ธ ์ํธ์์ฉ์ ์ด์ ์ ๋ง์ถ๊ณ Repository๋ ๋ฐ์ดํฐ ์ก์ธ์ค ๋ก์ง์ ์บก์ํํ์ฌ ํ์์ ๋ฐ๋ผ ํน์ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋ฐฉ์์ด๋ค. Spring์์๋ ์ด ๋ ๊ฐ๋ ์ด ํผ์ฉ๋์ด ์ฌ์ฉ๋๊ธฐ๋ ํ์ง๋ง, Repository๋ ์ข ๋ ๊ณ ์์ค์ ๊ฐ๋ ์ผ๋ก์ DAO๋ฅผ ๋ด๋ฌด์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ฐธ๊ณ : https://www.baeldung.com/java-dao-vs-repository
DTO (Data Transfer Object)์ VO (Value Object) ์ฐจ์ด
- DTO: ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ์ฒด๋ก, ๋ฐ์ดํฐ๋ง์ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๋ค. ์ฃผ๋ก Getter์ Setter ๋ฉ์๋๋ง ํฌํจํ๋ฉฐ, ์ฌ๋ฌ ๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ ์ด๋์ ์ํ ์ญํ ์ ์ํํ๋ค. ๊ฐ๋ณ์ฑ์ ๊ฐ์ง๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๋ฉ์๋์ ๊ฐ์ฒด๋ค ์ฌ์ด๋ฅผ ์ ๋ฌํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
- VO: DTO์์ Setter ๋ฉ์๋๋ฅผ ์ ์ธํ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ค. DTO๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ๋ณ ๊ฐ์ฒด์ง๋ง, VO๋ ํ ๋ฒ ์์ฑ๋ ํ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ค. MyBatis๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ์ด์จ ๊ฐ์ฒด๋ ์ฃผ๋ก VO๋ก ์ฒ๋ฆฌ๋๋ค.
์๋ฅผ ๋ค์ด, DTO๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์ ๋ฌํ๊ฑฐ๋, ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค. ๋ฐ๋ฉด์ VO๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ณ ๊ฐ์ผ๋ก๋ง ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
โน๏ธ ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
https://www.baeldung.com/java-dao-vs-repository
'๐ปDEV-STUDY > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ์ค๋ฌด์์์ Best Practices #2 (0) | 2024.10.07 |
---|---|
[Spring] ์ค๋ฌด์์์ Best Practices #1 (0) | 2024.10.07 |
[Spring] Spring ์์ฒญ๊ฐ ์ฒ๋ฆฌ ๋ฐฉ์ (0) | 2024.10.06 |
Spring Bean ์๋ฆฌ๊ณผ ์์กด์ฑ ์ฃผ์ (1) | 2024.10.06 |
[Spring]HttpMessageConverter (0) | 2024.10.06 |