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
'코딩 정리 > Spring' 카테고리의 다른 글
쿠키 토큰 세션 캐시 (0) | 2023.04.20 |
---|---|
[항해] Spring 숙련주차 #1 (0) | 2023.04.18 |
Spring - 스프링 입문(윈도우) : 프로젝트 환경설정 (1) | 2023.03.20 |