🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

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

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

Section - 3 역할의 분리와 스프링 컨테이너

 

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

 

스프링 컨테이너와 빈?

  • 스프링 컨테이너(클래스 저장소)

    • 서버가 시작될 때 스프링 서버 내부에 만들어지는 컨테이너

    • 컨테이너 안에는 클래스가 들어가게 된다.

  • 스프링 빈

    • 스프링 컨테이너 내부의 클래스

    • JDBC 템플릿도 스프링 빈으로 등록 되어 있다.

    • 빈을 식별할 수 있는 이름, 타입 등 다양한 정보가 저장되고 인스턴스화된다.

 

스프링 컨테이너를 왜 사용할까?

Service의 코드를 변경하지 않고 Repository를 변경할 수 있다. (BookMemoryRepository -> BookMySqlRepository)

  • 의존성 주입(DI, Dependency Injection)

    • 컨테이너가 Service를 인스턴스화 할 때 Repository 중 하나를 선택해 넣어주는 과정

  • 제어의 역전(IoC, Inversion of Control)

    • 컨테이너가 어떤 구현 타입을 쓸지 대신 결정해준다.

    • 컨테이너가 Repository 구현체 중 하나를 선택해 Service를 만들어준다.

  • Repositroy 주입

    • 어떤 Repository 주입시킬지 스프링 컨테이너에 명시(사용할 곳에 @Primary붙여주기)

    • @Primary : 우선권을 결정하는 어노테이션

 

스프링 빈 다루기

  • @Configuration

    • 클래스에 붙이는 어노테이션

    • @Bean 사용 시 함께 사용한다.

  • @Bean

    • 메소드에 붙이는 어노테이션

    • 메소드에서 반환되는 객체를 스프링 빈에 등록한다.

  • @Component

    • 주어진 클래스를 '컴포넌트'로 간주한다.

    • @RestController, @Service, @Repository, @Configuration 모두 내부적으로

      @Component를 가지고 있다.

    • 해당 어노테이션이 붙은 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다.

  • 스프링 빈을 주입 받는 방법

    • 생성자 사용(@Autowired 생략 가능)

    • setter 사용

    • 필드에 바로 사용

  • @Qualifier

     

    • 스프링 빈을 사용/등록하는 쪽 모두 사용 가능하다.

       

      • 빈을 사용하는 쪽에서만 사용하면, 빈의 이름을 적어주어야 한다.

      • 양쪽 모두 사용하는 경우 @Qualifier 끼리 연결된다.

    • @Qualifier@Primary 보다 우선순위가 높다

Section - 4 생애 최초 JPA 사용하기

 

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

 

SQL 직접 작성의 한계점

  • 작성 과정에서 실수가 발생할 수 있고 이를 인지하는 시점이 느리다.

    • 컴파일 시점에 발견되지 않고 런타임 시점에서 발견된다.

  • 특정 데이터베이스에 종속적이게 된다.

  • 반복 작업이 많아진다. 테이블 하나를 만들 때마다 CRUD 쿼리가 항상 필요하다.

  • 테이블과 객체는 패러다임이 다르다.

해결책

JPA (Java Persistence API)

 

JPA

  • 자바 진영의 ORM(Object-Relational Mapping)

     

  • 객체와 관계형 DB 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙

 

Hibernate

  • JPA의 구현체 프레임워크

    • JPA는 인터페이스이므로 실질적인 구현 코드가 필요한데 이것이 Hibernate이다.

  • 내부적으로 JDBC를 사용

     

     

    JPA 어노테이션

  • @Entity

     

    • 스프링이 User객체와 user 테이블을 같은 것으로 바라본다.

    • Entity : 저장되고 관리되어야 하는 데이터

  • @Id

    • 이 필드를 primary key로 간주한다.

  • @GeneratedValue

    • primary key는 자동 생성되는 값

    • MySQL의 auto_increment를 사용 = IDENTITY

  • @Column

    • 객체의 필드와 Table의 필드를 매핑한다.

    • null이 들어가 수 있는지 여부, 길이 제한, DB에서의 column 이름 등...

    • 생략 가능

       

       

Spring Data JPA

  • 복잡한 JPA 코드를 스프링에서 쉽게 사용할 수 있도록 도와주는 라이브러리

  • SQL을 작성하지 않아도 쿼리가 나갈 수 있도록 자동으로 처리해준다.

     

 

 

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

 

트랜잭션

  • 쪼갤 수 없는 업무의 최소 단위

  • 모든 SQL을 성공시키거나 하나라도 실패하면 모두 실패시킨다.

  • @Transactional 어노테이션을 대상 메서드에 붙여 적용한다.

  • commit : 트랜잭션 성공

  • rollback : 트랜잭션 실패

  • IOException과 같은 Checked Exception은 롤백이 일어나지 않는다.

 

영속성 컨텍스트

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

  • 트랜잭션 사용하면 영속성 컨텍스트 생겨나고,

    트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.

 

영속성 컨텍스트의 특수 능력 4가지

  1. 변경 감지(Dirty Check)

     

     

    1. 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도, 변경을 감지해 자동으로 저장된다.

  2. 쓰기 지연(Lazy Loading)

    1. DB의 INSERT / UPDATE / DELETE SQL을 바로 날리는 것이 아니라, 트랜잭션이 commit될 때 모아서 한 번만 날린다.

    2. 통신 횟수가 줄어든다.

  3. 1차 캐싱

    1. ID를 기준으로 Entity를 기억한다.

    2. 이렇게 캐싱된 객체는 완전이 동일하다.

 

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

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

  • 새로 만드는 것이 좋다

    • 두 기능 중 한 기능에 변화가 생겼을 때 side-effect 없이 대처할 수 있기 때문이다.

     

     

     

    과제

[과제 #4] API 개발

MYSQL DB 데이터를 저장하고 데이터를 처리해볼 수 있었다. 그리고 이를 Postman을 이용해 확인해 볼 수 있었다.

[과제 #5] 클린 코드


지난주에는 스프링과 DB에 대한 기본적인 내용을 학습했다면 이번 주에는 스프링의 핵심 개념에 대해 알 수 있었다. 그래서 이전의 수업들에 비해 수업 내용을 이해하는 데 더 많은 시간이 필요했던 것 같다. 그리고 과제 5와 특강을 통해 클린 코드와 테스트의 중요성에 대해서 다시 한번 느낄 수 느낄 수 있었다. 이번 주에는 여유가 없어서 주어진 강의와 과제만 진행했는데, 다음 주에는 배운 내용에 대해서 추가적인 공부를 할 수 있었으면 좋겠다.

댓글을 작성해보세요.

채널톡 아이콘