ORM, SQL, MVC
17 Jul 2022ORM
ORM: Object-Relation Mapping
Object: 객체지향 언어(자바, 파이썬)
Relational: 관계형 데이터베이스(H2,MySQL)
객체와 관계형 데이터베이스의 데이터를 자동으로 연결(mapping)해주는 것
ORM이 없으면 웹서버 개발은 못 하나?
ORM이 없어도 웹서버 개발 가능은 하지만…
- ORM이 없는 환경에서는 백엔드 개발자가 비즈니스 로직 개발보다 SQL 작성에 더 많은 시간을 할애하게 됨.
- SQL 작성이 단순하고 반복적인데 실수하기는 쉬움
- 그리고 웹 서버 개발 언어와 관계형 데이터베이스 언어의 목적 및 사용방법이 다름
백엔드 개발자는 DB에 대해 몰라도 되나?
그렇지 않다ㅠㅠ
DB 테이블 설계라든가 SQL Query 성능 확보 등을 위해서도 알아야 함
SQL
SQL은 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어다.
관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었다. (출처 위키백과)
대표적인 데이터베이스 관리 시스템은 MySql이 있는데… query 매번 까먹어서 정리된 사이트 열어두고 참고하며 했던 기억이…ㅎㅎ
근데 확실히 스프링에서 JPA로 처리가 가능하니까 일일이 insert into 안 써도 되고 좋긴 하다ㅋㅋ 아직은 모르는 게 많아서 애증의 존재지만.
스프링 MVC
스프링 MVC란
Model- View - Controller 디자인 패턴
Response
server에서 html을 내려주는 경우
- 정적(static) 웹 페이지
- Controller
- Client의 요청을 Model로 받아 처리
- 예) 회원가입을 위한 개인정보들(id, password, name)
- Client에게 View(정적 웹페이지, html)를 내려줌
- 동적(dynamic) 웹 페이지
- Controller
- Client의 요청을 Model로 받아 처리
- Tamplate engine에게 View, Model 전달
- View: 동적 html 파일
- Model: View에 적용할 정보들
- Template engine
- View에 Model을 적용 -> 동적 웹페이지 생성
- 예) 로그인 성공 시, “로그인된 사용자의 ID”를 페이지에 추가
- Template engine 종류: 타임리프(Thymeleaf), Groovy, FreeMarker, Jade 등(스프링에서 JSP 이용은 추천하지 않고 있음)
- View에 Model을 적용 -> 동적 웹페이지 생성
- Client에게 View(동적 웹페이지, html)를 내려줌
사실 요즘은 json 등으로 서버와 클라이언트 간에 데이터 주고받는 게 기본이라 딱히 정적인 웹페이지 / 동적인 웹페이지 구분이 없는 듯?
Controller와 HTTP Response 메시지
Controller | HTTP Response | |||
---|---|---|---|---|
@ResponseBody | Return 타입 | Return 값 | Header | Body |
X | String | {View name} | Content-Type:text/html | View(HTML)의 text 내용(타입리프 기준) /templates/{View name}.html |
redirect:/{redirect URL} | Location:{Host URL}/{redirect URL} | 없음 | ||
O | String | {Text} | Content=Type:text/html | {Text} |
String 외 | java 객체 | Content-Type:application/json | JSON (스프링이 java객체 -> json 변환) |
스프링 MVC 동작원리
스프링으로 작업하면서 Controller가 시작점과 끝점으로 보이지만, 사실 스프링이 뒤에서 많은 부분을 처리해주고 있다는 거…
- Client -> DispatcherServlet
- 가장 앞 단에서 요청을 받아 FrontController라고도 불림
- DispatcherServlet -> Controller
- API를 처리해 줄 Controller를 찾아 요청을 전달
- Handler mapping에는 API path와 Controller 함수가 매칭되어 있음 -> 함수 이름을 내 마음대로 설정 가능했던 이유
- Controller에서 요청하는 Request의 정보(Model) 전달
- Controller -> DispatcherServlet
- Controller가 Client로 받은 API 요청을 처리
- Model 정보와 View 정보를 DispatcherServlet으로 전달
- DispatcherServlet -> Client
- ViewResolver를 통해 View에 Model을 적용
- View를 Client에게 응답으로 전달
Request
Controller와 HTTP Request 메시지
Controller | HTTP Sample Request | ||
---|---|---|---|
Annotation | 생략가능 | Sample Code | |
@PathVariable | X | /{id} | GET /a/b/c |
@RequestParam | O | @GetMapping(.../param) | GET /param?id=a |
O | @PostMapping(.../param | POST /form/param Header Content type:application/x-www-form-urlencoded Body id=a | |
@ModelAttribute | O | @PostMapping("/form/model") @ModelAttribute Star star (이걸로 선언한 객체에는 @Setter 선언이 필요) | POST /form/model Header Content type:application/x-www-form-urlencoded Body id=a |
@RequestBody | X | @RequestBody Star star | POST /form/json Header Content type: application/json Body {"id":"a"} |