inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[인프런 워밍업 클럽 1기/BE] 두번째 발자국

스미슈
0

인프런 워밍업 클럽1기 두번째 회고록

 

Day06 : 스프링 컨테이너의 의미와 사용 방법

Day07 : Spring Data JPA를 사용한 데이터베이스 조작

Day08 : 트랜잭션과 영속성 컨텍스트

Day09 : 조금 더 복잡한 기능을 API로 구성하기

Day10 : 객체지향과 JPA 연관관계

 

 

[Day06] 스프링 컨테이너의 의미와 사용 방법

 

스프링 컨테이너와 빈?

 

스프링 컨테이너 사용 이유

Service의 코드를 변경하지 않고 Repository만 갈아 끼울 수 있다

 

스프링 빈 다루기

 

 

[Day07] Spring Data JPA를 사용한 데이터베이스 조작

 

SQL 직접 작성의 한계점

이런 문제점을 해소하기 위해 등장한 것이 JPA (Java Persistence API) 이다

 

JPA

 

Hibernate

 

Spring Data JPA

 

 

[Day08] 트랜잭션과 영속성 컨텍스트

 

트랜잭션

 

영속성 컨텍스트

테이블과 매핑된 Entity 객체를 관리/보관하는 역할

 

영속성 컨텍스트의 능력

  1. 변경 감지(Dirty Check)

     

    1. 영속성 컨텍스트 내의 Entity는 명시적 save가 없어도 변경을 감지해 자동으로 저장된다

  2. 쓰기 지연(Lazy Loading)

    1. DB의 INSERT/UPDATE/DELETE SQL을 그때그때 날리지 않고 트랜잭션이 commit 될 때 모아서 한 번만 날린다

    2. 통신 횟수가 줄어드는 이점

  3. 1차 캐싱

    1. 조회 요청이 올 때 우선 1차 캐시에서 데이터를 찾는다

    2. 만약 1차 캐시에 데이터가 있으면 → DB를 찾아보지 않고 바로 반환

    3. 만약 1차 캐시에 데이터가 없다면 → DB에서 데이터를 찾고 1차 캐시에 저장 후 반환

 

 

[Day09] 조금 더 복잡한 기능을 API로 구성하기

 

도서를 생성, 대출, 반납하는 API를 만들어보며 이전에 배운 것들을 익힐 수 있었다.

 

HTTP Body 스펙이 동일할 때, DTO를 새로 만들어야 할까?

→ 새로 만드는 것이 좋다

→ 한쪽의 기능에 변화가 생겼을 때 side-effect 없이 대처할 수 있기 때문!

 

 

[Day10] 객체지향과 JPA 연관관계

 

객체 지향적으로

Service에서 UserLoanHistory에 접근하던 기존의 구조

User 에서 UserLoanHistory를 가져와 처리하도록 바꾸고 싶다

UserUserLoanHistory는 서로를 알고 있어야 한다

 

연관 관계

 

연관관계의 주인

 

옵션

 

지연 로딩

 


제출 과제

 

[과제4] 과일 가게 API

API의 요청에 따라 MySQL DB에 데이터를 저장하고 데이터를 가져오는 것을 연습할 수 있었다. Controller에서 SQL을 작성해 jdbcTemplate로 전달하도록 구현된 상태이다.

 

[과제5] 클린 코드 적용하기

과제 5를 바탕으로 깜짝 라이브가 있었다. 라이브의 핵심 내용을 요약하자면 다음과 같다.

  1. 리팩토링 전 가장 먼저 테스트 코드를 준비해야 한다

  2. 테스트 코드를 작성하기 어려운 구조라면, 테스트 코드 작성을 위한 준비부터 해야 한다

    1. (Point!) 테스트를 작성하려고 노력하면 자연스럽게 좋은 구조가 나올 확률이 올라간다

과제 5를 진행하며 테스트 코드에 대한 생각은 하지 않았기 때문에… 과제 5의 코드를 바탕으로 실제 테스트코드를 작성하고 리팩토링 하는 과정을 살펴보며 얻어가는 부분이 많았다. 특히 랜덤 부분을 테스트하기 위해 NumberGenerator라는 인터페이스를 생성하고 인터페이스를 inplements하는 RandomNumberGenerator를 만들었던 부분이 인상적이었다.

백엔드 워밍업 스터디

답변 0