
인프런 워밍업 클럽 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가 만들어 진건지, 어떻게 사용하고 실제 구현체는 무엇이면 어떻게 동작할 수 있는지 배울 수 있던 한 주였다.
강의 내용처럼 앞으로도 공부하는데 있어서 기술의 사용법에 그치지 않고 기술의 등장 배경과 원리를 함께 이해한다면 한단계 더 성장 할 수 있을 것 같다.
댓글을 작성해보세요.