본문 바로가기
카테고리 없음

230204 TIL

by hbIncoding 2023. 2. 5.

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) 웹페이지

  1. Client의 요청을 Model로 받아 처리
  2. Client에게 View(정적 웹페이지, HTML)를 내려줌
  • 빠르다 : 요청에 대한 파일만 전송함으로 추가적인 작업 없음
  • 비용이 적다 : 마찬가디로 웹 서버만 구축하면 됨
  • 서비스가 한정적 : 저장된 정보만 보여줌
  • 관리가 힘들다 : 추가/수정/삭제의 작업 모두 수동

 ㄴ. 동적(dynamic) 웹페이지

  1. Client의 요청을 Model로 받아 처리
  2. Template engine에게 View(동적 HTML 파일), Model(View에 적용할 정보들) 전달
  3. Template engine이 View에 Model 적용> 동적 웹페이지 생성
  4. Client에게 View(동적 웹페이지, HTML)를 내려줌
  • 서비스가 다양: 다양한 정보를 조합하여 동적으로 생성하여 제공 가능
  • 관리가 쉽다 : 웹 사이트 구조에 따라서 추가/수정/삭제 등의 작업이 용이
  • 상대적으로 느림 : 사용자가 웹 페이지를 전달하기 전에 처리하는 작업이 필요
  • 추가 비용 발생 : 웹 서버외에 추가적으로 처리를 위한 어플리케이션 서버(web application server) 필요

 2)Spring MVC 동작 원리

  1. Client -> DispatcherServlet(FrontContoller)
  2. API를 처리해 줄 Controller를 찾아 요청 전달
  3. Controller가 Client에게 받은 API 요청 처리, Model과 View 정보를 다시 전달
  4. ViewResolver를 통해 View에 model 적용, view를 Client에게 응답으로 전달