본문 바로가기
TIL/Spring

23.07.25

by J1-H00N 2023. 7. 25.

스프링 심화 주차로 넘어오면서 JPA에 대해 더 자세히 다루게 되었다.

 

모든 회사의 모든 프로젝트가 JPA 적용되어있는게 아니므로, ORM에 대해 알아야 할 필요가 있다.

 

 JDBC > QueryMapper > ORM(JPA)로 발전해오면서 각 기능을 포함하고 있기 때문에, 어떤 단점을 보완하기 위해 JPA가 생긴 것인지 알아야 제대로 쓸 수 있다.

 

JDBC : JAVA와 DB를 연결해주기 위해 생긴 기술, JPA도 이 기술을 사용한다.

 

JDBC Driver는 여러 데이터베이스와 연결할 수 있는 기능을 제공한다.

JDBC Driver Manager는 런타임 시점에 Connection을 생성하여 쿼리를  요청할 수 있는 상태로 만들어주고, Statement를 생성하여 쿼리를 요청, ResultSet을 생성해 쿼리 결과를 받아올 수 있게 해준다.

> 사용 후에는 꼭 close()

 

docker라는 앱을 설치하고 실행하는 과정에서 docker desktop is unable to detect a hypervisor. 에러가 발생했다.

이를 해결하기 위해 bios도 조회하고 재시작도 여러번 하는 등 수많은 시도를 했으나 변화가 없었다.

다행히도 본인은 아래와 같은 방법으로 해결했다.

시작 아이콘 우클릭 > 앱 및 기능 > 선택적 기능 > 기타 windows 기능 > Windows 하이퍼바이저 플랫폼, 가상 머신 플랫폼 체크 풀기 > 재시작 > 체크 > 재시작

이렇게 하니 에러 메시지가 WLS2 가 없다는 에러 메시지로 바꼈다.

이후 아래 링크를 5단계까지 실행해서 해결했다.

https://learn.microsoft.com/ko-kr/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

 

위 과정에서 2시간 넘는 시간을 소비해 계획이 무너졌다...

 

docker 사용 예시

        // docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=teasun -e POSTGRES_DB=messenger --name postgres_boot -d postgres

        // docker exec -i -t postgres_boot bash
        // su - postgres
        // psql --username teasun --dbname messenger
        // \list (데이터 베이스 조회)
        // \dt (테이블 조회)

 

JDBC 로 직접 SQL을 작성했을때의 문제

  • SQL 쿼리 요청시 중복 코드 발생
  • DB별 예외에 대한 구분 없이 Checked Exception (SQL Exception) 처리
  • Connection, Statement 등.. 자원 관리를 따로 해줘야함
    • 안해주면 메모리 꽉차서 서버가 죽음

이 문제 해결을 위해 처음으로 Persistence Framework 등장!

  • Persistence Framework 는 2가지가 있다.
    • SQL Mapper : JDBC Template, MyBatis 👈 요게 먼저나옴
    • ORM : JPA, Hibernate

SQL Mapper (QueryMapper)

  • SQL ↔ Object
  • SQL 문과 객체(Object)의 필드를 매핑하여 데이터를 객채화

 

JDBC Template

  • SQL Mapper 첫번째 주자로 JDBCTemplate 탄생
    • 쿼리 수행 결과와 객채 필드 매핑
    • RowMapper 로 응답필드 매핑코드 재사용
    • Connection, Statement, ResultSet 반복적 처리 대신 해줌
    • 😵‍💫 But, 결과값을 객체 인스턴스에 매핑하는데 여전히 많은 코드가 필요함

MyBatis

  • SQL Mapper 두번째 주자로 MyBatis 탄생
    • 반복적인 JDBC 프로그래밍을 단순화
    • SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL 을 분리!
    • 😵‍💫 But, 결국 SQL을 직접 작성하는것은 피곤하다…(DB 기능에 종속적) 😫
    • 😵‍💫 But, 테이블마다 비슷한 CRUD 반복, DB타입 및 테이블에 종속적이다.

 

QueryMapper 의 DB의존성 및 중복 쿼리 문제로 ORM 이 탄생했다.

  • ORM 은 DB의 주도권을 뺏어왔다고 표현해도 과언이 아닙니다.
  • ORM 은 DAO 또는 Mapper 를 통해서 조작하는것이 아니라 테이블을 아예 하나의 객체(Object)와 대응시켜 버립니다.
  • 말이 쉽지…. 객체지향(Object) 을 관계형 데이터베이스(Relation) 에 매핑(Mapping) 한다는건 정말 많은 난관이 있습니다.

 

 

25일차 개인과제 @RestControllerAdvice 사용해보기, Service 인터페이스와 구현체 분리하기

 

@RestControllerAdvice는 Controller가 예외처리를 할 때마다 try-catch문을 사용함으로써 가동성도 떨어지고 코드가 길어지는 것을 막아준다.

이는 저번 프로젝트에서 진행했던 예외처리를 사용해 ApiResponseDto를 만들어 유사하게 만들어 봤다. 

Service와 ServiceImpl 분리는 Service를 인터페이스화 하고 모든 로직을 Impl에 옮기는 것으로 간단히 마무리했다.

'TIL > Spring' 카테고리의 다른 글

23.07.27  (0) 2023.07.27
23.07.26  (0) 2023.07.26
23.07.12  (0) 2023.07.12
23.07.11  (0) 2023.07.11
23.07.10  (0) 2023.07.10