본문 바로가기
코딩 정리/Spring

[항해] Spring 숙련주차 #2

by 실버십 2023. 4. 18.

MySelectShop

- 키워드로 상품검색, 그 결과를 목록으로 보여주기 : NAVEROpenApi

- 관심 상품 등록하기 

- 관심 상품 조회하기 

- 관심 상품 최저가 등록하기 

- 회원가입 (1-5)

- 로그인 (1-5)

- 로그인 성공 시 토큰 발급 (1-6)

- 로그 아웃 (1-6)

- 로그인 한 유저만 관심상품 등록, 조회, 최저가 등록 가능 (1-6)

- ADMIN 계정은 모든 상품 조회 가능 (1-6)

 

상품 표현 목록 : title, image, link, lprice, myprice

 

1-3

[수업 목표]

product 관련 API들을 하나의 AllInOneController에 만들어 본다 

AllInOneController의 한계점을 알아본다 

프로젝트 생성 및 UI 사전 작업

 

한계점 

 하나의 클래스에 너무 많은 양의 코드 존재 : 코드 이해가 어려움 

 코드 추가 혹은 변경 요청시 어려움을 겪을 수 있다. 

 

절차적 프로그래밍(Procedural Programming) 

VS

객체지향 프로그래밍(Object-Oriented Programming)

  객체하나에 하나의 역할만 하도록

 

 

1-4 Refactoring

[수업 목표]

1. AllInOneController 를 Refactorying 하며 계층 분리에 대해 이해한다

2. IoC, DI 에 대해 이해와 사용법 습득

 

 

처리과정 : Controller, Service, Repository 사이의 처리과정 

 

Repository : DB 와 연결 및 CRUD 작업 

 

<REFACTORING>

1. Controller 를 역할에 따라 Controller, Service, Repository 세가지로 나누기 

관심 상품 등록 시 Client 에게 응답하는 값 변경 : Controller 만 확인 

최저가 업데이트 조건 변경 : Service 만 확인

DB 테이블 이름 변경 : Repository 만 확인

 

2. 객체 중복 생성 문제 해결하기 

 문제 : new ProductRepository() 코드 중복

 해결 : 멤버변수 선언 및 생성자에서 new ProductRespository() 선언 

 

3. DI(의존성 주입) 

강한 결합의 문제점: 이어진 상태 new -> new > new 로 객체가 연결 된 상태로 서로에게 영향을 준다. 

  - 객체 하나를 변경한다면, 연결된 모든 클래스, 객체들을 변경해 줘야한다. 

  - 프로그램의 흐름 : Controller -> Service -> Repository 

 

-->해결 방법 : 느슨한 결합

 1. 각 객체에 대한 객체 생성은 딱 한번만 

 2. 생성된 객체를 모든 곳에서 재사용

 - 프로그램의 흐름 : Respository -> Service -> Controller

 

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

  프로그램의 제어 흐름이 뒤바뀜

  - 용도에 맞게 객체를 가져다 사용 (DI : Dependency Injection: 의존성 주입)

 

4. 스프링 IoC 컨테이너 사용하기

  : DI 를 사용하기 위해 객체 생성하는데 객체 생성을 스프링 프레임 워크가 다 해준다. ;) 

빈(Bean) : 스프링이 관리하는 객체

스프링 IoC 컨테이너 : "빈"을 모아두는 통

 

<잠깐>

더보기

스프링 "빈" 등록 방법 

1. @Component  : 클래스 위에 설정

 - 스프링 서버 실행 될 때 스프링 IoC에 "빈" 저장 

 - @CompementScan 에 설정해준 package 위치와 하위 package 들

   (Application.java 에서 @SpringBootApplication에 의해 default 로 설정 되어 있다)

 

2. @Bean : 직접 객체를 생성하여 빈으로 등록 요청 할 수 있다. 

  - 클래스에 @Configuration 설정 && 등록하려고 하는 함수 위에 @Bean 설정

 

Bean 객체 주입 방법

1. @Atuowierd 

 - 변수에 주입 : 주입을 하려는 변수 위에 추가

 - 생성자에 주입 : 변수를 final 로 선언 후 생성자 위에 추가 

 *Autowired 적용 조건 

  - 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능 

 - 생략 조건 

   오버로링 된 생성자(파라미터가 다른 생성자들) : 생략 불가

   생성자 선언 하나만일 때 : 생략 가능 

   Lombok 의 @RequiredArgsConstructor 를 사용 : 생략 가능 * 단 이때, final로 선언한 멤버 변수만 @Autowired를 자동으로 생성 

 

2. ApplicationContext : 스프링 IoC 컨테이너에서 빈을 수동으로 가져오는 방법

 

 

5. 스프링 3계층 Annotation 적용하기 

 1. @Controller, @RestController

 2. @Service

 3. @Repository 

 -> 얘네들은 모두 @Component 가 들어 있는 Annotation 이다 

* 만약 JpaRepository 를 사용한다면 @Repository 가 자동 추가 된다 

* JpaRepository <Entity클래스명, id의데이터타입> 을 상속받는 interface 로 선언 

 

 

6. 스프링 프레임 워크 이해하기 

 스프링은 기업용 어플리케이션의 요구 사항 해결에 초점을 맞춘 프레임워크 

 (기업용 어플리케인션의 특징 : 신뢰성 중요, 서버 안성성, 그리고 데이터 관리도 중요하다)

 

7. 스케쥴러 만들기 

 -> 매일 새벽 1시에 관심상품목록 제목으로 검색해서, 최저가 정보를 업데이트하는 스케줄러를 만들기 

 

 

[수업 목표]

1. 인증 인가에 대해 이해 

2. 회원가입, 로그인, 로그아웃 구현하고 흐름 이해하기 

3. 현재 프로젝트에서 구현한 인증, 인강의 한계점을 이해

 

 

인증과 인가

스프링 시큐리티 : 스프링에서 인증과 인가를 관리해준다. 

 

인증(Authentication) : 해당 유저가 실제 유저인지 인증하는 개념 

인가(Authorization) : 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념 (관리자 페이지 - 관리자 권한)

 

 

인증의 방식

 웹어플리케이션의 인증 의 특징 

 - 서버-클라이언트 구조로 되어 있지만, 두 요소는 매우 멀리 떨어져 있다. 

 - Http 라는 프로토콜을 이용하여 통신하는데, 그 통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어진다.  

  * 비연결성 : 서버와 클라이언트가 연결되어 있지 않다. (채팅, 게임 등이 아니라면) 하나의 요청에 하나의 응답을 내고 연결을 끊고 있다. (리소스 절약하기 위해서)

  * 무상태 : 서버가 클라이언트 상태를 저장하지 않는다. 서버의 비용과 부담을 증가시키기 때문에 저장하지 않는다. (직전에 한 것을 저장하지 않는다)

  -> url을 계층적으로 설계한다면 클라이언트는 연속적으로 사용한다고 느낄 수 있다. 

 

무상태 프로토콜에서 "유저가 인증되었다"라는 정보를 유지시키는 방법

1. 쿠키 - 세션 방식의 인증

 : 서버가 특정 유저가 로그인 되었다는 상태를 저장하는 방식 

   인증과 관련된 최소한의 정보만 저장하여 로그인 유지 

 

2. JWT 기반 인증

 : JWT(JSON Web Token) 는 인증에 필요한 정보들을 암호화시킨 토큰

   JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버기 클라이언트를 식별

  * JWT 를 Decoded(해독)하면 = Header, PayLoad, Verify Signature 이렇게 세 부분으로 나뉘어진다.

    암호와 관련된 정보의 양식 : Header, Verify Signature

    유저의 정보 : PayLoad