인프런 워밍업 클럽 BE 1기 - 2주차 발자국

인프런 워밍업 클럽 BE 1기 - 2주차 발자국

학습한 내용

 

스프링 컨테이너

  • 서버가 시작될 때, 함께 시작되는 클래스들을 담는 거대한 공간

  • 스프링 빈을 등록하고 관리하는 역할을 한다.

  • 이를 통해 객체의 생성, 의존성 관리, 라이프사이클 관리 등을 처리한다.

  • build.gradle 파일에 설정한 의존성들도 함께 스프링 빈으로 등록된다.

  • 스프링 빈을 등록하는 과정에서 필요한 의존성을 함께 설정해준다.

     

     

    의존성(Dependency)

  • 하나의 요소가 다른 요소에게 영향을 받는 관계

  • 소프트웨어의 유연성과 유지보수성에 영향을 준다.

     

     

    스프링 빈(Spring Bean)

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

  • 이때 다양한 정보도 함께 들어있고, 인스턴스화도 이루어진다.

  • 스프링 컨테이너 안으로 들어간 클래스를 스프링 빈이라고 한다.

     

     

등록 방법

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

    • @Bean을 사용할 때 함께 사용해 주어야 한다.

  • @Bean:

    메서드에 붙는 어노테이션

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

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

    • 컴포넌트로 간주된 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다.

    • @RestController, @Service, @Repository, @Configuration 어노테이션은 모두 @Component 어노테이션을 가지고 있다.

       

       

스프링 빈을 주입 받는 방법

  • 생성자를 이용해 주입받는 방식

     

    • 가장 권장하는 방식이다.

       

  • setter를 통해 주입받는 방식

     

     

  • 필드에 직접 주입하는 방법

    • 기본적으로 권장되지 않는다.

    • setter를 통해 다른 인스턴스로 교체해 동작에 문제가 생길 수 있다.

    • 필드에 바로 주입하게 되면 테스트가 어렵다.

     

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

  • 객체를 생성하는 과정에서 스프링 컨테이너가 필요한 의존성을 자동으로 선택해서 주입해준다.

  • 스프링 컨테이너가 필요한 의존성을 설정해주는 과정을 의존성 주입(DI, Dependency Injection) 이라고 한다.

  • 이렇게 하면 코드의 수정 없이 의존성을 변경할 수 있고, 애플리케이션의 유연성을 높인다.

JPA(Java Persistence API)

  • 데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙

  • 자바 진영에서 제공하는 ORM(Object-Relational Mapping) 기술의 표준 API

  • 영속성(Persistence): 서버가 재시작 되어도 **데이터는 영구적으로 저장**되는 속성

  • API: 정해진 규칙

     

ORM(Object-Relational Mapping)
- Object: 자바에서의 객체를 의미한다.
- Relational: 관계형 데이터베이스의 테이블을 의미한다.
- Mapping: 객체와 데이터를 매핑하는 작업을 의미한다.
  • JPA는 단순히 API일 뿐이므로, 실제 동작을 위해서는 JPA 구현체가 필요하다.

  • 대표적으로 Hibernate가 있고, Hibernate는 내부적으로 JDBC를 사용하여 데이터베이스와 통신한다.

영속성 컨텍스트(Persistence Context)

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

  • 스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생성되고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.

  • 영속성 컨텍스트의 특성들을 통해, 데이터의 일관성을 유지하고, 데이터베이스와의 통신 효율을 높일 수 있다.

     

기능

  • 변경 감지(Dirty Check)

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

  • 쓰기 지연

    • DB의 INSERT/UPDATE/DELETE에 대한 SQL을 즉시 보내는 것이 아니라, 트랜잭션이 COMMIT될 때 모아서 한 번만 날린다.

    • 이렇게 하면 네트워크 비용과 데이터베이스 리소스 사용을 최소화하여 성능을 개선할 수 있다.

  • 1차 캐싱

    • 영속성 컨텍스트는 조회된 Entity를 내부 캐시에 저장한다.

    • 같은 트랜잭션 내에서 동일한 Entity를 다시 조회할 때는 데이터베이스에 추가적인 쿼리를 실행하지 않고, 1차 캐시에서 직접 객체를 반환한다.

    • 이렇게 되면 데이터베이스 접근 횟수를 줄여 성능을 향상된다.

    • 캐싱된 객체는 완전히 동일하다.

    Spring Data JPA

    복잡한 JPA 코드를 쉽게 사용할 수 있도록 도와주는 스프링 프레임워크의 모듈


  • 스프링은 JpaRepository<Entity, ID>를 구현 받는 Repository에 대해 자동으로 SimpleJpaRepository 기능을 사용할 수 있게도 해 준다.

    • save: 주어지는 객체를 저장하거나 업데이트 시켜준다.

    • findAll: 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.

    • findById: id를 기준으로 특정한 1개의 데이터를 가져온다.

    • delete: 주어진 객체를 삭제한다.

  • 함수 이름만 작성하면, 알아서 SQL을 만들어 준다.

     

    구절

    By 앞에 사용되는 구절

    • find

      • 반환 타입은 객체가 될 수도 있고,

        Optional<타입>이 될 수도 있다.

    • findAll

      • 쿼리의 결과물이 N개인 경우 사용한다.

      • 반환 타입 List<타입>

    • exist

      • 쿼리 결과가 존재하는지 확인한다.

      • 반환 타입 boolean

    • count

      • SQL의 결과 개수를 센다.

      • 반환 타입 long

  • By 뒤에 사용되는 구절

    • 필드 이름이 들어간다.

    • 필드들은 And 또는 Or로 조합될 수 있다.

    • 필드 이름만 작성하면 동등 조건(=)으로 쿼리가 생성된다.

    • 외에 다양한 조건을 활용할 수 있다.

      • GreaterThan : 초과

      • GreaterThanEqual : 이상

      • LessThan : 미만

      • LessThanEqual : 이하

      • Between : 사이에

      • StartsWith : ~로 시작하는

      • EndsWith : ~로 끝나는

         

     

    회고

    이번주에는 스프링 컨테이너와 빈, 그리고 JPA에 대해 학습했다. 스프링은 기능을 쉽게 구현할 수 있도록 IoC와 DI 같이 기능을 제공한다. 그동안은 사용하는데 그쳤다면 이번에는 스프링 빈은 무엇이며 어떻게 등록하고, 어떻게 스프링에서 의존성 주입을 해 주는지 알 수 있었다. 이를 통해 스프링의 핵심 개념을 이해할 수 있었다.

     

     

    또한, JDBC를 사용하면서 오타로 인해 런타임시에 예외가 발생한 적이 종종 있었지만 이번 JPA를 사용하면서 이런 예외를 줄일 수 있었다. Java 진영에서 어떤 목적을 가지고, JPA가 만들어 진건지, 어떻게 사용하고 실제 구현체는 무엇이면 어떻게 동작할 수 있는지 배울 수 있던 한 주였다.

    강의 내용처럼 앞으로도 공부하는데 있어서 기술의 사용법에 그치지 않고 기술의 등장 배경과 원리를 함께 이해한다면 한단계 더 성장 할 수 있을 것 같다.

     

댓글을 작성해보세요.

채널톡 아이콘