Spring 입문 주차 2일차
1. JPA 기초
1)어플리케이션이 DB를 직접 다룰 때 문제점
ㄱ. 번거로운 단계를 거친다.
- 데이터베이스 테이블 만들기
- 어플리케이션에서 직접 쿼리 만들기
- 쿼리를 jdbc api 통해 직접 실행
- 쿼리 결과로 해당 객체도 직접 만들어줘야함
ㄴ. SQL의존적이라 변경에 취약
- 쿼리문도 직접 또 수적해야함
- 유저객체에 값 넣어주는 부분도 당연히 추가해야함
- ORM이 없는 환경에서 일이 많아진다.
ㄷ. 객체지향 모델과 관계형 데이터베이스의 패러다임 불일치가 발생
객체 | 릴레이션 | |
밀도 문제 | 다양한 크기의 객체를 만들 수 있음, 커스텀한 타입 만들기 쉬움 | 테이블, 기본 데이터 타입 |
서브타입 문제 | 상속, 다형성 구현 쉬움 | 상속 없음, 다형적인 관계 표현 불가 |
식별성 문제 | 레퍼런스 동일성, 인스턴스 동일성 | 오직 pk |
관계 문제 | 서로간의 객체 참조를 통해 표현, 다대다 가능, 방향이 있다 | 다대다 x, 다대다를 맺어주는 테이블로 처리, 외래키가 있어서 바로 조회 가능(방향 없음) |
데이터 네비게이션 문제 | 마음대로 레퍼런스타고 이동 가능 | 그러한 방식이 비효율적(매번 join, 그리고 다 가저오면 성능문제) |
- 관계형 데이터 베이스에는 상속 개념이 없다.
- 관계 문제, 데이터 네비게이션 문제가 발생
2)ORM(Object Relational Mapping), JPA(Java Persistence API)의 등장
ㄱ. ORM
- 객체와 DB의 테이블이 매핑을 이루는 것, 객체가 테이블이 되도록 매핑 시켜주는 것
- ORM을 통해 SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작 가능
- 생산성이 높아진다.
- Query가 복잡해지면 ORM으로 표현하는데 한계가 있고, 성능이 raw query에 비해 느린 단점이 있다.
ㄴ. JPA
- 자바 ORM 기술에 대한 API 표준 명세
- 쿼리 자동생성
- 어플리케이션 계층에서 SQL의존성을 줄여 작업 단순화
- 패러다임의 불일치를 해결
- 특정 상황을 제외하고 성능이 괜찮음
- H2, mySQL, Oracle 에 붙여도 코드의 변경이 없다. 표준 SQL을 준수했다면 JPA가 다 처리해줌
3)DB의 연관관계, JAP 연관관계
ㄱ. DB 연관관계
- 관계형 데이터베이스는 테이블끼리 관계를 맺을 수 있다.
- 관계는 논리적으로 연관이 있는 두 테이블 사이의 연결을 설정한다.
- 테이블 구조를 정제하고 중복 데이터를 최소화 하는 것을 도와준다.
ㄴ. JPA 연관관계
관계 | 코드 선언 |
일대다(1:N) | @OneToMany |
다대다(N:1) | @ManyToOne |
일대일(1:1) | @OneToOne |
다대다(N:N) | @ManyToMany |
4)Spring Data JPA
- Spring framework에서 JPA를 편리하게 사용할 수 있도록 지원
- CRUD 처리를 위한 공통 인터페이스 제공
- repository 개발 시 인터페이스만 작성하면 싱행 시점에서 스프링 데이터 JPA 가 구현 객체를 동적으로 생성해서 주입
- 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발 완료하도록 지원
- 공통 메서드는 스프링 데이터 JPA가 제공하는 org.springframework.date.jpa.repository.JpaRepository 인터페이스에 count, delete, deleteAll, deleteAll, deleteById, existsById, findById, save .. 등이 있다.
- 관계는 논리적으로 연관이 있는 두 테이블 사이의 연결을 설정한다.
- 테이블 구조를 정제하고 중복 데이터를 최소화 하는 것을 도와준다.
2. Spring MVC 이해
1)스프링 MVC
ㄱ. 정적(static) 웹페이지
- Client의 요청을 Model로 받아 처리
- Client에게 View(정적 웹페이지, HTML)를 내려줌
- 빠르다 : 요청에 대한 파일만 전송함으로 추가적인 작업 없음
- 비용이 적다 : 마찬가디로 웹 서버만 구축하면 됨
- 서비스가 한정적 : 저장된 정보만 보여줌
- 관리가 힘들다 : 추가/수정/삭제의 작업 모두 수동
ㄴ. 동적(dynamic) 웹페이지
- Client의 요청을 Model로 받아 처리
- Template engine에게 View(동적 HTML 파일), Model(View에 적용할 정보들) 전달
- Template engine이 View에 Model 적용> 동적 웹페이지 생성
- Client에게 View(동적 웹페이지, HTML)를 내려줌
- 서비스가 다양: 다양한 정보를 조합하여 동적으로 생성하여 제공 가능
- 관리가 쉽다 : 웹 사이트 구조에 따라서 추가/수정/삭제 등의 작업이 용이
- 상대적으로 느림 : 사용자가 웹 페이지를 전달하기 전에 처리하는 작업이 필요
- 추가 비용 발생 : 웹 서버외에 추가적으로 처리를 위한 어플리케이션 서버(web application server) 필요
2)Spring MVC 동작 원리
- Client -> DispatcherServlet(FrontContoller)
- API를 처리해 줄 Controller를 찾아 요청 전달
- Controller가 Client에게 받은 API 요청 처리, Model과 View 정보를 다시 전달
- ViewResolver를 통해 View에 model 적용, view를 Client에게 응답으로 전달