🤍 전 강의 25% 할인 중 🤍

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

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

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

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

2주 차는 이론보다 실습이 많았다. 그리고 이전보다 조금 더 깊은 주제를 다뤘다. 한 번에 이해가 가지 않는 주제들도 많아서 여러 번 반복해서 보고 있다. 트랜잭션 스크립트패턴과 도메인 모델패턴을 사용해 봤던 게 가장 인상 깊었다.

 

무엇을 배웠나?

 

6일 차: 스프링 컨테이너의 의미와 사용 방법

스프링 컨테이너

- 서버가 시작되면 컨테이너가 생기고 스프링 빈이 들어간다.
- 컨테이너는 무엇이고, 스프링 빈은 무엇일까?
- 컨테이너는 클래스의 정보(스프링 빈)를 담고 있다.
- 빈으로 등록된 클래스의 연관관계를 정리해 준다.
- 스프링빈으로 등록될 때 인스턴스화를 진행한다.
- 스프링빈은 두 가지의 타입을 가진다.
    1. 의존성을 추가하여 등록되는 빈
    2. 사용자가 직접 추가하는 빈
- 빈으로 등록되지 않은 클래스를 의존하려 할 때 컨테이너에 조회되지 않고 빈으로 등록하라고 에러가 발생한다.
- 그렇다면 왜 스프링 컨테이너와, 빈을 사용해야 할까? `new` 키워드를 사용해서 직접 인스턴스화하면 되지 않을까?

IoC, DI

- 스프링 컨테이너를 이해하기 위해서는 3단 변화를 직접 느껴야 함
- class -> interface -> 스프링 컨테이너(IoC, DI)
- IoC(제어의 역전)는 객체의 생성, 삭제등 관리를 내가 직접 하지 않고 프레임워크(컨테이너)에게 위임함
- DI(의존성 주입)는 의존성을 직접 주입하지 않고 컨테이너가 주입함
- 같은 타입의 빈이 등록되어 있을 때 컨테이너도 어떤 빈을 주입해야 하는지 교통정리를 해줄 수 없음, 이때는 사용자가 빈의 우선권을 등록해줘야 함(@Primary)
- 결국 컨테이너를 사용하는 이유는 변화에 유연하게 대응하기 위해서임, 클래스를 사용하는 코드에는 변화를 주지 않고 변화가 필요한 구현코드에만 수정함

빈을 어떻게 등록하고, 주입할까?

- 컨테이너에 등록되는 빈을 등록하기 위해서는 `@Configuration`과 `@Bean`을 이해해야 함
- `@Configuration`은 클래스에 사용하고 `@Bean`은 메서드에 사용함
- 일반적으로 사용자가 직접 만든 클래스는 Controller, Service, Repository 어노테이션을 사용함.
- 외부 라이브러리, 프레임워크에서 제공하는 클래스를 빈으로 등록할 때 두 어노테이션을 조합하여 사용함
- `@Component`는 컨트롤러, 서비스, 리포지토리 외에 추가 클래스를 스프링 빈으로 등록할 때 사용함

- 빈을 주입시키는 방법은 3가지가 있음(생성자, setter, 필드)
    - 생성자 주입이 가장 권장되는 방식임(불변, null 체크)
    - setter 주입은 setter 메서드를 열어둠으로써 누군가 사용하여 오염될 수 있음
    - 필드 주입의 경우 `@Autowired`를 사용하는데 테스트 코드 작성시 어려움
- @Qualifier: 같은 타입의 빈을 구별하는데 사용함
- @Primary: 우선권을 지정할 때 사용
- @Qualifier 는 사용하는 쪽과 등록하는 쪽 모두에서 사용해 연결할 수 있음
- @Qualifier와 @Primary가 동시에 사용될 경우 Qualifier가 우선권을 가짐
- 스프링은 사용자가 직접 지정한 설정을 우선으로 함

 

7일 차: Spring Data JPA를 사용한 데이터베이스 조작

문자열 SQL을 직접 사용할 때 문제점과 JPA

- 문자열을 직접 사용하는 것은 실수(오탈자)가 발생할 확률이 높음. 에러가 컴파일 시점에 발견되지 않고 런타임 시점에 발견되는 치명적인 문제(운영 중 발견)
- 프로그래밍 언어와 관계형 데이터베이스의 패러다임 불일치
- 반복적인 작업 발생(CRUD)
- 변화에 유연한 프로그램 구현이 어려움: 특정 데이터베이스에 종속됨
- JPA(Java Persistence API)는 자바진영의 ORM 기술 표준을 의미함: 데이터를 영구적으로 보관하기 위한 규칙
- 영속성(Persistence)은 영구적인 속성
- 규칙(Interface)을 구현하기 위해 Hibernate(구현체)를 사용
- Hibernate는 내부적으로 JDBC를 사용함

Entity Class 만들기

- Entity는 관리되어야 할 데이터를 의미함
- 기존 클래스를 엔티티로 선언하기 위해서는 `@Entity`를 사용
- id를 기본키로 만들어 주기 위해서는 `@Id`를 사용
- `@GeneratedValue` 해서 기본키 생성전략을 제공해야 함
- JPA를 사용하기 위해서는 기본 생성자가 제공되어야 함 이때 `protected`로 선언
- `@Column`은 테이블과 매칭, 다양한 옵션을 선언할 수 있음. nullable, length, name...
- JPA를 사용하기 위해서는 설정에 추가해야 함
- `ddl-auto`: 서버가 시작될 때 테이블을 어떻게 처리할 것인지를 정함
- `hibernate.show_sql`: 데이터베이스에 날리는 SQL을 보여줌
- `hibernate.format_sql`: 포맷팅 해서 보기 좋게 보여줌
- `hibernate.dialect`: SQL 방언을 JPA가 수정해 줌

Spring Data JPA 사용하기

- JPA를 편리하게 사용할 수 있도록 Spring에서는 Spring Data JPA를 지원함
- Spring Data JPA -> JPA -> Hibernate -> JDBC
- save: 객체를 저장하거나 업데이트
- findAll: 일치하는 모든 데이터 조회
- findById: id를 기준으로 일치하는 데이터 1개 조회
- Spring Data JPA를 사용하면 다양한 쿼리를 조합할 수 있음
- find, findAll, count, 등등...

8일 차: 트랜잭션과 영속성 컨텍스트

- 트랜잭션이(Transaction)이란 더 이상 쪼갤 수 없는 업무의 최소단위를 의미함
- 트랜잭션을 시작하면 모두 성공(commit)하거나 되돌리기(rollback)할 수 있음
- 트랜잭션을 적용할 때 `@Transactional`을 사용함
- 영속성 컨텍스트가 핵심

 

9일 차: 조금 더 복잡한 기능을 API로 구성하기

API 스펙을 설계하고 직접 구현하는 것을 권장

 

10일 차: 객체지향과 JPA 연관관계

이전에 구현된 코드는 객체가 협력하지 않고 직접 객체를 가져다 쓰는 방식으로 작성되었음. 어떻게 하면 객체가 서로 협력하는 관계를 맺어줄 수 있을까?

> ![비즈니스 로직구현 Entity VS Service](https://www.inflearn.com/questions/117315/%EB%B9%84%EC%A7%80%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81%EA%B5%AC%ED%98%84-entity-vs-service)

- 서비스에 작성된 비즈니스 로직을 도메인 계층으로 이동시킴

 

과제

 

마무리

우려하던 일은 현실이 돼버렸다. 컨디션 관리에 실패했다. 궁금한 주제를 탐구하기도 하고 딴짓을 하다 늦게 잠들었다. 수면패턴이 꼬이고 생산성도 저하됐다. 결국 시간을 알차게 보내지 못했다. 과제를 해결하는데 급급하기도 했고, 진도표를 몰아서 듣기도 했다. 연쇄반응으로 걱정도 늘어났다.

 

불행 중 다행으로 긍정적인 사실도 찾을 수 있었다. 잠(루틴)의 중요성을 느꼈다. 푹 자고 일어나서 루틴을 다시 시작하니 금방 제모습으로 돌아왔다. 이외에도 다양한 주제를 탐구하다 보니 견문이 넓어졌다. 시간을 효율적으로 보내고 얼른 접하고 싶은 욕심이 든다.

댓글을 작성해보세요.

채널톡 아이콘