[인프런 워밍업 클럽 0기 BE] - 두 번째 발걸음

[인프런 워밍업 클럽 0기 BE] - 두 번째 발걸음

  • 강의 수강

     

     

    • 일주일 동안 학습했던 내용을 요약해주세요.

    image

    2주차(6일차 ~ 14일차)의 학습 내용.

     

     

    스프링 컨테이너, JPA 사용, 그리고 AWS EC2 서버를 이용한 배포까지 진도를 나갔다.

     

    • 일주일 간의 학습 내용에 대한 간단한 회고를 작성해 주세요.

    -> 강의를 들으며 작성한 강의노트를 바탕으로 작성

     

     

     

     

    19~22강. 역할의 분리와 스프링 컨테이너

Spring Container (클래스 저장소)

-> 데이터소스/JDBCTemplate/환경...

-> 관계를 파악하고 자동으로 의존성 설정을 해준다.

 

Spring Bean

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

-> JDBCTemplate도 스프링 빈으로 등록되어있다.

-> @Service / @Repository 어노테이션으로 Service와 Repository도 스프링 빈으로 등록할 수 있다.

 

@Primary

BookMeomeoryRepository 와 BookMySqlRepository 둘 다 @Repository 선언이 있을 경우,

스프링 컨테이너도 어떤 레포지토리를 선택해야할지 모른다.

그럴때 @Primary 어노테이션 사용하여 우선권을 정해줄 수 있다.

 

@Configuration

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

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

 

@Bean

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

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

 

@Component

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

이 클래스들은 스프링 서버가 시작될 때, 자동으로 감지된다.

@Repository, @Service, @RestController 등등에도 @Component 처리가 되어있다.

-> @Component , 언제 사용할까?

1) @Controller, @Service, @Repository 모두 아니고,

2) 개발자가 직접 작성한 클래스를 Spring Bean으로 등록할 때

사용되기도 한다.

 

정리

우리가 개발과정에서 만들게 되는 class 들은 @Service나 @Repository를 사용하는것이 좋다.

( @Configuration@Bean을 통해 구현할 순 있다.)

• Spring Bean 을 주입받는 방식에는 3가지가 있는데,

1) 생성자를 통한 주입방식 -> 가장 권장 됨

2) @Setter@AutoWired를 통한 주입. -> 누군가가 setter를 사용하면 오작동할 수 있다.

3) 필드에 직접 @Autowired 사용 -> 테스트를 어렵게 만드는 요인.

 

23~29강. Spring Data JPA를 사용한 데이터베이스 조작

SQL을 직접 작성하는 것의 단점

1) 문자열을 작성하기 때문에 실수할 수 있고, 실수를 인지하는 시점이 느리다.

-> 자바 문법이 아니라 그저 문자열일 뿐이기 때문에 컴파일 시점에 에러가 발견되는 것이 아니라,

런타임 시점에 알게된다.

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

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

4) 데이터베이스의 테이블과 개ㅑ객체는 패러다임이 다르다.

 

Java Persistence API (JPA)
- 자바 진영ORM ?

Object : 자바의 객체

Realational : 관계형 DB의 Table

Mapping : 둘을 짝찟는다.

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

 

HIBERNATE

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

Java 진영의 규칙을 구현한 구현체. (내부적으로 JDBCTemplate 사용)

 

@Entity

스프링이 해당 객체와 테이블을 같은 것으로 인식한다.

@Entity는 반드시 기본 생성자가 필요하다. (public or protected)

 

@Id

해당 필드값을 데이터베이스 테이블의 PrimaryKey 로 인식함.

 

@Column

null이 들어갈 수 있는지 여부, 길이 제한, DB 컬럼 이름과의 매핑 등등을 설정할 수 있다.

만약 @Column 어노테이션이 달려있는 변수의 이름이 데이터베이스의 컬럼명과 동일하다면,

name 속성은 생략 가능하다.

 

Spring Data JPA

Spring Data JPA는 복잡한 JPA 코드를 쉽게 사용할 수 있도록 바꿔준다.

Spring DATA JPA -> Hibernate(JPA를 구현) -> JdbcTemplate 이런식으로 접근하여 JDBC를 사용하게 된다.

 

트랜잭션(Transaction)

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

ex) 쇼핑몰에서 물건을 주문시,

1) 주문 기록을 저장,

2) 포인트 저장,

3) 결제 기록 저장

-> 하나라도 실패하면 전부다 실패처리

 

영속성 컨텍스트

스프링에선 트랜잭션이 시작되면 영속성 컨텍스트가 생겨나고,

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

 

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

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

[2] 쓰기지연 : DB의 INSERT/UPDATE/DELETE Sql을 바로 날리는 것이 아니라, 트랜잭션이 commit될 때 모아서 한번만 날린다.

[3] 1차캐싱 : ID를 기준으로 Entity를 기억해뒀다가, 다시 해당 Entity를 조회해야할 경우, 캐싱된 객체를 반환하고

추가적인 Sql문의 생성을 막는다.

[4] 지연로딩 : 연결되어 있는 객체를 꼭 필요한 순간에만 가져온다. (불필요한 sql문의 전송을 막는다.)

 

30~ 36강. 트랜잭션과 영속성 컨텍스트를 이용한 요구사항 구현

@ManyToOne/ @OneToMany(N : 1의 연관관계 )

ManyToOne (다수) / OneToMany(1)

ManyToOne은 단방향으로 쓸 수 있다. (반대쪽에 OneToMany를 붙여주지않아도 괜찮다.)

 

연관관계의 주인

연관관계의 주인 = 데이터베이스의 Table을 보았을 때, 누가 관계의 주도권을 가지고 있는가?

-> 다수(ManyToOne)이 One의 Primary_Key를 가지고 있으므로, Many가 주인이다.

연관관계의 주인의 값이 설정되어야지만 진정한 데이터가 저장된다.

 

@ManyToMany(N : N의 연관관계)

구조가 복잡하고, 테이블이 직관적으로 매핑되지 않아 사용하지 않는 것을 추천한다. (1 : N으로 나눠버리는것 이 편하다.)

 

cascade

한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능.

cascade 옵션을 활용하면 저장이나 삭제를 할 때 연관관계에 놓인 테이블까지 함께 저장 또는 삭제가 이루어진다.

 

orphanRemoval

연관관계가 끊어진 데이터를 자동으로 제거해준다.

 

정리

연관관계의 장점

1) 각자의 역할에 집중하게 된다. (= 응집성)

- 서비스 계층의 역할 :

꼭 필요한 경우 서로 다른 도메인끼리 협업을 하게 도와준다.

트랜잭션을 관리한다.
외부 의존성(Spring Bean)등을 관리한다.

- 도메인의 역할 :

도메인 객체가 표현하고 이쓴ㄴ 관심사에 대한 로직을 처리한다.

2) 새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.

3) 테스트 코드 작성이 쉬워진다.

 

연관관계의 단점

1) 지나치게 사용하면 성능상의 문제가 생길 수도 있고 도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.

2) 너무 얽혀 있으면 A를 수정했을 경우 B C D 까지 영향이 퍼지게 된다.

 

37~ 42강. 배포 준비

배포

최종 사용자에게 SW를 전달하는 과정 / 전용 컴퓨터에 우리의 서버를 옮겨 실행하는 것.

 

Profile

배포용 서버는 보통 Linux를 사용하게 된다. (운영환경이 달라짐)

-> 똑같은 서버 코드를 실행시키지만, 실행될 때 설정을 다르게 하고 싶다..!

 

H2 DB

경량 데이터베이스로 , 개발 단계에서 많이 사용되며, 디스크가 아닌 메모리에 데이터를 저장한다.

개발 단계에서는 테이블이 자주 변경되므로, 테이블을 신경쓰지 않고 코드에만 집중할 수 있다.

 

Git

코드를 쉽게 관리할 수 있게 해주는 버전관리 프로그램

 

GitHub

git으로 관리되는 프로젝트의 코드가 저장되는 저장소.

git으로 관리되는 프로젝트를 gitHub에 올릴 수 있다.

-> GitHub에 저장하는 이유

1) 컴퓨터의 코드는 모종의 이유로 소실 될 수 있다.

2) 배포를 할 때 활용할 수 있다.

3) 내 컴퓨터에서 배포용 컴퓨터로 코드를 옮기는데 깃허브를 사용할 수 있다.

 

정리

1) 배포가 무엇인지 이해하고, 배포를 하기 위해 어떤 준비를 해야 하는지 알아 본다.

2) 스프링 서버를 실행할 때 DB와 같은 설정들을 코드 변경 없이 제어할 수 있는 방법을 알아본다.

3) Git과 GitHub의 차이를 이해하고, Git에 대한 기초적인 사용법을 알아본다.

4) AWS의 EC2가 무엇인지 이해하고, AWS를 통해 클라우드 컴퓨터를 빌려본다.

 

 

43~48강. AWS와 EC2 배포

정리

1) EC2에 접속하는 방법을 알아보고, EC2에 접속해 리눅스 명령어를 다뤄보았다.

2) 개발한 서버의 배포를 위해 환경 세팅을 리눅스에 진행하였다.

3) Foreground와 Background의 차이를 이해하고, Background 서버를 제어한다.

4) 도메인 이름을 사용해 사용자가 IP대신 이름으로 접속 할 수 있도록 한다.

 

49강~ 마무리. Spring Boot 설정 / 버전업 이해하기

스프링과 스프링부트의 차이점

1. 간편한 설정

2. 간단한 의존성 관리

3. 강력한 확장성

4. MSA에 적합한 모니터링

 

MSA란 ?

하나의 거대한 서버를 이용하는 대신 관심사에 맞는 작은 서버들을 잘게 쪼개서 각 관심사에 맞는 부분들만 관리하는 것.

 

정리

1) Build.gradle 의 정의와 플러그인, dependencies에 대해 학습하였다.

2) 스프링과 스프링부트의 차이점에 대해 학습하였다.

3) application.yml 파일을 분석하며 YAML 문법에 대해 학습하였다.

4) Spring Boot 2.7 버전에서 Spring Boot 3.0 버전으로 마이그레이션을 진행해 보았다.

 


 

  • 미션

     

    • 미션을 해결하는 과정을 요약해 주세요.

 

[6일차 과제]

스프링 컨테이너에 대하여 학습하고, 기존에 작성했던 Controller 코드를 3단으로 분리를 하는 과제였지만,

이미 분리를 하여 과제를 수행하였기에,

반대로 다시 합쳐보는 과정을 통해 계층 간 분리의 필요성과 클린코드에 대해 다시 한 번 느낄 수 있는 과제였다.

 

[7일차 과제]

 6일차 과제에서 만들었던 Fruit 기능들을 JPA를 이용하여 구현하는 과제였다.

분명 강의를 들었을 땐 이해했다고 느꼈던 개념들이, 막상 직접 구현하려하니 생각보다 어려웠고, JPA에 대한

숙련도가 충분하지 못하다는걸 깨닫게 되었다..

또한, DataBase의 Column명과 객체의 필드명이 일치하지 않는 문제로 고생을 했었는데,

객체의 필드명이 만약 soldOut 이런식이면 데이터베이스에 매핑될 때는

sold_out이런식으로 언더바가 들어가게 된다는것을 처음알게 되었다.

 

[미니 프로젝트 - 1일차]

팀 등록 기능 / 직원 등록 기능 / 팀 조회 기능 / 직원 조회 기능을 구현하는 과제였다.

사용된 기술 스택은

  • 자바 17 버전

  • Spring Boot 3.x.x버전

  • JPA

  • MySql

이다.

 

[코드 리뷰 - 1일차]

리뷰를 통해 내가 미처 생각하지 못했던 더 좋은 프로그래밍 방법이나, 앞으로 무엇을 더 학습하면 좋을지 알게 되었다.

나름대로 고민했던 부분들도 다른 분들의 피드백을 통해 더 나은 방향으로 나아갈 수 있었다.

양질의 피드백을 남겨주시는 그룹원들이 정말 너무 고맙다 🙇

 


댓글을 작성해보세요.