항해99/스프링 숙련

4주차 메모

숲별 2022. 10. 14. 01:21
728x90

x회원 가입 /api/member/signup  post
x로그인 /api/member/login   post
게시글 작성 /api/auth/post    post
x게시글 조회  /api/post    GET
x게시글 상세조회   /api/post/{id}  GET
게시글 수정   /api/auth/post/{id}   PUT
게시글 삭제   /api/auth/post/{id} DELETE
댓글 생성   /api/auth/comment   POST
x댓글 목록 조회  /api/comment/{id}  GET
댓글 수정  /api/auth/comment/{id}  put
댓글 삭제  /api/auth/comment/{id}  delete

mysql 엔드포인트 : springboot-database.c1aotxtidxmh.ap-northeast-2.rds.amazonaws.com

시큐리티랑 JWT
시큐리티 : 세션방식
JWT : 토큰 

stateless, stateful
enum
@Slf4j

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Pattern
@Size
@Valid

상대방과 연관짓기위해 사용하는 키 :  외래키
many to one에서 외래키 가지고 있음
댓글에서 관리 중
댓글에 존재하는 post id가 외래키고 post의 pk를 바라보고 있음.
변경시 연관관계 주인인 댓글에서 변경@JoinColumn
mappedBy = "post"는 comment.java에 있는 post

@OneToMany(mappedBy = "post", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)

fetch = FetchType.EAGER
eager : 게시글 조회시 게시글과 댓글가져옴
   댓글이 또 연관관계 있을 경우 문제 생길 수 있음.(딸린애들 다 가져옴.)
lazy : 게시글 조회시 게시글만 가져옴.
보통 더 많이 사용.

cascade = CascadeType.REMOVE : 사멸주기 같이 함.
게시글 삭제시 댓글도 같이 삭제.

양방향 연관관계 썼는데
단방향도 존재.
원 투 매니는 단방향으로 잘 안쓰지만 (원투매니는 원래는 외래키가 없기때문)
매니 투 원은 쓰기도한다.(외래키는 매니투원에 있기때문)

폼 로그인이 시큐리티가 제공
보안성에 있어서 안전하고 인증인가를 우리가 직접 설계할 필요없이
시큐리티가 제공하는 인증방식을 사용해서

서로가 서로를 불러서 그걸 막기위해 @JsonIgnore

-----
JWT는 Header, Payload, Signature 3개로 구성

Header : Signature 해싱 위한 알고리즘 정보 담겨있음
Payload : 서버와 클라이언트가 주고 받는, 시스템에서 실제로 사용될 정보에 대한 내용들을 담고 있음.
Signature : 토큰의 유효성 검증을 위한 문자열
--------------------

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL;

뱀굴 겉핥기 그대로 하시는 
로그인 회원가입
yml
:이 점으로 바뀌면 됨 마지막 : 은 =으로
properties



올바른 API 설계

rainbow
atom

닉네임, 인증시간

관리자 가입 토큰
AAABnv/xRVklrnYxKZ0aHgTBcXukeZygoC

REST API 키
c4e701eaa429c3f2b264e9be0906a0d1

- **Lombok**
- **Spring Web**
- **Spring Data JPA**
- **H2 Database**
- **MySQL Driver**
spring Boot Devtools 
Security

s4nxxejtxEw2ZUSBHIa7
U3ChCYltNj
패키지 위치를 잡에서 바로 만드는 ㅓ였음

병현 충남 당진27
도운 서울 강서구
윤서 신소재공학 https://velog.io/@younseo1016
은선 29살

헤더 토큰만든 알고맂므
바디 전체적인 내용

jwt.io에서 토큰 까서 볼 수 있음


-a : 모든 연결 및 열린 포트를 확인
-n : 주소 및 포트를 숫자 형식으로 표시
-o : 현재 연결이 어떤 프로그램이 사용중인지 PID(프로세서 ID)만 표시

jpa

쿼리 메소드
2주차 

git-hub의
basic.js

장재영 매니저님 깃헙 https://github.com/jaeyoungjang2

과제다하면
cs공부



영속성 컨텍스트 변경감지

 


- **인증(認證, Authentication)**: 사용자 신원을 확인하는 행위
    - 회사 출입을 위한 출입증 확인 혹은 생체정보 (지문, 홍채) 인식
- **인가(認可, Authorization)**: 사용자 권한을 확인하는 행위

- 10/07 (금) 15:00 : 협력사 세션 (이큐브랩) https://ecubelabs.notion.site/Software-Team_-a8fe174a97fc42babd5d77e2f4d5f739
- 10/09 (일) : WIL 제출(주제 DI, IoC, Bean)
- 10/11 (화) 14:00 : 협력사 세션 (레티널)
- 10/12 (수) 14:00 : 실전 팀빌딩 방식 발제
- 10/13 (목) 10:00~12:00 : 주특기 숙련주차 시험
- 10/13 (목) 21:00까지 : 주특기 숙련 주차 개인/팀 과제 제출 완료
- 10/14 (금) 09:00 : 주특기 심화 주차 발제

한 객체가 어떤 객체(구체 클래스)에 의존할 것인지는 별도의 관심사이다. Spring은 의존성 주입을 도와주는 DI 컨테이너로써, 강하게 결합된 클래스들을 분리하고, 애플리케이션 실행 시점에 객체 간의 관계를 결정해 줌으로써 결합도를 낮추고 유연성을 확보해준다. 이러한 방법은 상속보다 훨씬 유연하다. 단, 한 객체가 다른 객체를 주입받으려면 반드시 DI 컨테이너에 의해 관리되어야 한다는 것이다.

두 객체 간의 관계라는 관심사의 분리
두 객체 간의 결합도를 낮춤
객체의 유연성을 높임
테스트 작성을 용이하게 함
출처: https://mangkyu.tistory.com/150 [MangKyu's Diary:티스토리]


[01]
1. Cookie, Session
2. JWT
3. OAuth2
4. Spring Security JWT
5. @Builder

6. [SecurityFilterChain](https://www.notion.so/Spring-Security-OAuth2-2fef0b65ea534cdf822954acf6c53c5b)

[02]
1. JPA ORM
2. JPA Data Query, QueryDSL
[04]
1. AccessToken, RefreshToken
2. Bearer
3. Spring Boot JWT OAuth2

<팀과제>
Q1. 스프링 프레임워크는 어떤 특징 혹은 장점을 가지고 있나요? (3가지 이상)
Q2. 스프링에서 DI (의존성 주입) 를 사용하는 이유가 무엇인가요? 예를 통해 설명 해 보세요.
Q3. 스프링 시큐리티를 사용해 회원관리하는 방법을 순서도를 통해 정리해 보세요.
Q4. 개발자 테스트 코드 작성 시 장/단점과 테스트 종류 별 (단위 테스트, 통합 테스트, E2E 테스트) 로 특징은?
Q5. ORM, JPA, Spring Data JPA 를 구분해서 설명해 보세요.
필수 X ) 절차지향 프로그래밍, 객체지향 프로그래밍,  관점지향 프로그래밍은 각각 어떻게 다른가요? (각각 예제 1개 이상)

<개인과제질문>
1. FormLogin을 활용할 때와 활용하지 않을 때 어떤 차이점이 있었나요?
2. 처음 설계한 API와 ERD에 변경사항이 있었나요? 
변경되었다면 어떤 점 때문일까요? 첫 설계의 중요성에 대해 생각해보세요.
3. Refresh Token을 사용하는 이유가 뭘까요?
4. 3번의 이유로 사용한다면, 왜 매번 Access Token과 Refresh Token을 모두 재발급 할까요? 만료 시간과 관련하여 고민/검색 해보세요!

 

<개인과제>
1. 아래 요구사항에 맞는 API 명세서와 ERD 설계
**ERD 설계 →** [https://www.erdcloud.com/](https://www.erdcloud.com/)
    
    **API 명세서 작성 툴 →** [https://learnote-dev.com/java/Spring-A-문서-작성하기/](https://learnote-dev.com/java/Spring-A-%EB%AC%B8%EC%84%9C-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0/)
    
2. 회원 가입 API
    - 닉네임, 비밀번호, 비밀번호 확인을 request에서 전달받기
    - 닉네임은 `최소 4자 이상, 12자 이하 알파벳 대소문자(a~z, A~Z), 숫자(0~9)`로 구성하기
    - 비밀번호는 `최소 4자 이상이며, 32자 이하 알파벳 소문자(a~z), 숫자(0~9)` 로 구성하기
    - 비밀번호 확인은 비밀번호와 정확하게 일치하기
3. 로그인 API
    - 닉네임, 비밀번호를 request에서 전달받기
    - 로그인 버튼을 누른 경우 닉네임과 비밀번호가 데이터베이스에 등록됐는지 확인하기
    - 로그인 성공 시, JWT를 활용하여 AccessToken을 발급하고, 
    발급한 AccessToken은 Header의 Access-Token에 담아서 반환하기
    - 로그인 성공 시, JWT를 활용하여 RefreshToken을 발급하고,
    발급한 RefreshToken은 Header의 Refresh-Token에 담아서 반환하기
    - **참고 자료**
        1. [https://www.youtube.com/watch?v=ewslpCROKXY&t=440s](https://www.youtube.com/watch?v=ewslpCROKXY&t=440s)
        2. [https://www.inflearn.com/course/스프링부트-jwt](https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-jwt)
        3. [https://bcp0109.tistory.com/301](https://bcp0109.tistory.com/301)
4. 로그인 검사
    - `아래 API를 제외하고` 모두 AccessToken, RefreshToken을 전달한 경우만 정상 response를 전달받을 수 있도록 하기
        - 회원가입 API
        - 로그인 API
        - 게시글 목록 조회 API
        - 게시글 조회 API
        - 댓글 목록 조회 API
    - cf. Authorization에 담긴 AccessToken으로 사용자 판단
5.  댓글 목록 조회 API
    - AccessToken이 없어도 댓글 목록 조회가 가능하도록 하기
    - 조회하는 게시글에 작성된 모든 댓글을 response에 포함하기
6. 댓글 작성 API
    - AccessToken이 있고, 유효한 Token일 때만 댓글 작성이 가능하도록 하기
7. 댓글 수정 API
    - AccessToken이 있고, 유효한 Token이면서 해당 사용자가 작성한 댓글만 수정 가능하도록 하기
8. 댓글 삭제 API
    - AccessToken이 있고, 유효한 Token이면서 해당  사용자가 작성한 댓글만 삭제 가능하도록 하기
9. 예외 처리
    - Refresh Token을 전달하지 않거나 정상 토큰이 아닐 때는 "Token이 유효하지 않습니다." 라는 에러 메세지를 response에 포함하기
    - 데이터베이스에 존재하는 닉네임을 입력한 채 회원가입 버튼을 누른 경우 "중복된 닉네임입니다." 라는 에러메세지를 response에 포함하기
    - 비밀번호와 비밀번호 확인 값이 일치하지 않을 때 “비밀번호와 비밀번호 확인이 일치하지 않습니다.” 라는 에러 메세지를 resonse에 포함하기
    - 로그인 시, 전달된 닉네임과 비밀번호 중 맞지 않는 정보가 있다면 "사용자를 찾을 수 없습니다."라는 에러 메세지를 response에 포함하기
    - AccessToken이 있고, 유효한 Token이면서 해당 사용자가 작성한 게시글/댓글이 아닌 경우에는 “작성자만 삭제할 수 있습니다.”라는 에러 메세지를 response에 포함하기


더 나아가기: 과제가 일찍 마무리 되었다면 아래의 내용도 진행해보세요.
1. 내 프로젝트에 swagger 적용해보기
    - swagger란? Open Api Specification(OAS)를 위한 프레임워크 입니다. API들이 가지고 있는 스펙(spec)을 명세, 관리할 수 있으며, 백엔드와 프론트엔드가 협업할 때 사용할 수 있습니다!




뇌분절 세브란스 단절 애플TV

기초 다시잡기 세션-----------------------------------------------------------------------------
<optional>
Null체킹로직

Null값으로 인해 오류를 일으킬 가능성이 큰 경우
결과없음을 명확하게 드러내기 위한 메서드의 반환타입


파라미터로 이용x
Null 값 할당 x
멤버변수 x
isPresent() - get() 사용 지양
 : 존재하니? - 있으면 가져와

Optional<User> user = ...;
if(user.inPresent())) {
return user.get();
} else{
return null;
}

----------------

Optional<User> = ...;
return user.orElse(null);

----------------

Optional<User> user = ...;
if(user.isPresent()) {
return user.get();
} else {
throw new NoSuchElementException();
}

-----------------------

Optional<User> user = ...;
return user.orElseThrow(
()->new NosuchElementException()
);

-----------
Optional은 무적이 아니다
----------

<@RequiredArgsConstructor>-의존성 추가/생성자 수정, 1+1?

Lombok 중복코드 줄이기 위해서 사용(Getter, Setter)

DI(Dependency Injection) 의존성 주입
기능을 외부에서 가져와야 하는데
왜 피동적인 주입이라는 용어를 쓸까?
모든 걸 하려면 객체가 필요
개발자가 new로 만들어서 쓰는 게 아니라
스프링이 가지고 있다가 너 이거 필요해? 내가 작성해 줄게
스프링이 관리해줄게

@Autowired + 생성자

IOC

@Component

static은 메소드(공통영역)에 올라감
jvm올라갈 때 한꺼번에 올라가면 초기화 불가

service는 레포지토리 필요


@RequiredArgsConstructor// final 혹은 @NotNull이 붙은 필드의 생성자를 자동으로 만들어준다.
@AllArgsConstructor //여기에 필드에 쓴 모든생성자만 만들어줌
@NoArgsConstructor //기본 생성자를 만들어줌


실제 비즈니스 로직에 집중해

<Annotation>-공식문서에 답이 있다.
인터넷상 지식을 최대한 활용하려면 영어 어쩔 수 없어..

@Configuration -> 클래스
@Bean -> 메서드(1개 이상)

싱글톤패턴

Config
설정을 좀 어렵게 쓴다..?

셀렉션?

리팩토링?

윤서 : 서울 건대근처
공은희 : 24