https://github.com/mottoslo/h99-Spring-Assignments/tree/main/assignment2/Spring_assignment_Lv2

 

GitHub - mottoslo/h99-Spring-Assignments: Spring week01-03 Assignments

Spring week01-03 Assignments. Contribute to mottoslo/h99-Spring-Assignments development by creating an account on GitHub.

github.com

 

 

https://imslo.tistory.com/62 의 업그레이드 버전

 

Spring Boot 간단한 게시판 만들어보기 // POSTMAN

POSTMAN은 View 없이도 API 동작을 실험해볼 수 있는 도구. JPA, h2(데이터베이스), Lombok 사용 디렉터리 생성 Controller // Repository // Service 디렉터리 만들어주기 + DB의 테이블 역할을 할 entity, + 클라이언

imslo.tistory.com

추가 기능 :

-회원가입

-로그인

-JWT인증

//회원가입페이지 요청// - 미구현
GET "api/user/register/"
==================================================================
// 회원 가입 요청//
POST "/user/register/"

Request : "userid" : "userid",
"username" : "name",
"password" : "Password",
"email" : "askdjf@naver.com"

Response : "가입 성공하였습니다" (임시)
==================================================================
//로그인페이지 요청// - 미구현
GET "user/login"

==================================================================
//로그인 요청//
POST "user/login"

Request : "userid" : "userid",
"password" : "password"

Response : Header => Authorization : Bearer <JWT>
redirect:/api/article
==================================================================
//전체 게시물 조회//

GET "api/article"

Request : -

Response : "createdAt" : "timestamp",
"modifiedAt" : "timestamp",
"id" : Long,
"title" : "title",
"content" : "content",
"author" : "author"
== List<ResponseDTO>

==================================================================
//게시물 등록 //

POST "api/article"

Request : Header => Authorization : Bearer <JWT>
Body =>
"title" : "title",
"content" : "content"

Response :
{ResponseDTO}

===================================================================
//특정 게시물 조회(by id)

GET "api/article/{id}"

Request : -

Response : {ResponseDTO}

===================================================================
// 게시물 수정 (by id)//

PUT "api/article/{id}"

Request : Header => Authorization : Bearer <JWT>
Body =>
"title" : "title",
"content" : "content",

Response : {ResponseDTO}

===================================================================
// 게시물 삭제 (by id)//
DELETE "api/article/{id}"

Request : Header => Authorization : Bearer <JWT>

Response : "success" : true

===================================================================





 
 

추가공부할것 : HttpServlet // JPA 엔티티 연관관계

'공부 > Spring' 카테고리의 다른 글

Spring Security  (0) 2023.04.25
ExceptionHandler // ResponseEntity // HTTP 상태 반환  (0) 2023.04.23
Auth // JWT  (0) 2023.04.19
Spring Boot 간단한 게시판 만들어보기 // POSTMAN  (0) 2023.04.18
Spring MVC 패턴 이해하기  (0) 2023.04.16

https://imslo.tistory.com/67 게시판 CRUD 업그레이드

 

HttpServletRequest,  HttpServletResponse로 api통신 간에 데이터를 주고받는 법을 약간 익힘

==>주말에 공부 더 하기

 

JWT 사용법 익힘

 

JPA 연관관계 활용해봄

==> 주말에 공부 더 하기

Authentication // Authorization

 

Spring에서는 대표적으로 Spring Security를 적용하여 인증 / 인가를 관리한다.

 

<Authentication>

유저가 해당 유저가 맞는지 (지문인식, ID/PW비교, Face ID   등)

 

<Authorization>

유저가 해당 리소스에 접근 가능한지 (접근권한)

eg) 관리자 페이지, 회원페이지, 관리자 권한 ... etc

 

 

<Web Application에서의 Authentication>

HTTP 통신은 비연결성, 무상태의 특징을 가짐

Web App에서는 일반적으로 서버-클라이언트가 항시 연결되어있는 것이 아님 (비연결성 - Connectionless)

서버가 클라이언트의 상태를 저장하지 않는다. (무상태 - Stateless)

 

그런데 우리가 웹서핑을 할때, News/Sports/9 에서 뒤로가기를 누르면 이전 정보가 불러와지는것처럼 보임

계층적인 URL  설계를 통해 다음 요청 URl을 이전 계층에 두었기 때문.

그럼 요청이 갈 때마다 인증을 다시하는가 ? NO. 무상태 프로토콜에서 인증을 유지시키는 방법 

1. 쿠키-세션 방식

 - 클라이언트의 쿠키와 서버의 세션에 사용자 key를 저장하고, 요청에 쿠키를 담아 서버에서 검증

쿠키

2. JWT(JSON web token) 방식

- JSON 포맷을 이용하여 사용자 속성을 저장하는 Claim 기반의 웹 토큰

- 로그인 요청이 확인되면, JWT를 발급하여 클라이언트에게 보냄. 클라이언트는 토큰을 저장소에 보관하고, 요청마다 토큰을 같이 보냄. 서버에서는 토큰을 검증

- 세션 유지의 경우, 서버가 여러개일 경우 세션 Storage를 따로 구축해야함. JWT는 Secret Key만 공유하면 위조검증 가능

     ==> 동시접속자가 많을 때 서버측 부하를 낮출 수 있다

     ==> Client, Server가 다른 도메인을 사용 할 때 쉽다(OAuth같은 경우)

- 단점 :  구현의 복잡도가 증가하고, JWT에 담는 내용이 커질수록 네트워크 비용 증가 (클라이언트 -> 서버)

             기존 생성된 JWT를 일부만 만료시킬 방법이 없다.

              Secret Key 유출시 JWT 조작 가능

 

각 방법을 고도화 한 방법이 있고, OAUTH 소셜로그인도 있다.

 

<JWT>

https://jwt.io/introduction

JWT 토큰은 HMAC 알고리즘으로 secret_key에 의해 sign 되거나,

                    RSA / ECDSA를 사용하여 public, private key에 의해 서명된다.

 

Secret_key로 구현해보자

 

<구현>

@PostConstruct : 의존성이 주입되고 나서 실행됨을 보장하는 annotation.

JWS가 만들어지는 과정 대충

subject 인코딩 -> 암호화 알고리즘 -> secret key로 서명

claim 인코딩 -> 암호화알고리즘 -> secret key로 서명

필요한 부분들을 인코딩하고 secret key와 암호화알고리즘으로 서명하고, .으로 구분해 3 부분의 문자열로 만듬.

 

코드를 보면

1Jwts.builder 활용.

2.Subject 추가(여기선 유저이름)

3.claim추가("Key", value) => 토큰이 디코딩 시 제공해야하는 정보를 담음(권한같은거)

4.발행시간, 만료시간 추가

5.암호화된 key와 signature 알고리즘 명시

6.변환한 뒤, compact()로 압축

==> asfklsafakljsfhaksldjfhd.jasdiflasdjflidsafj.asldfjksdakldsjalk   와 같은 JWS 발급

 

//////////////Decoding///////////////

Claims 객체를 반환하며, claim.getBody().getSubject()와 같이 claim들을 가져올 수 있다.

https://imslo.tistory.com/62

POSTMAN은 View 없이도 API 동작을 실험해볼 수 있는 도구.

 

 

<Spring Boot, Postman으로 게시판 CRUD 만들어보기>

JPA, h2(데이터베이스), Lombok 사용

 

<1> 디렉터리 생성

Controller // Repository // Service 디렉터리 만들어주기

+ DB의 테이블 역할을 할 entity,

+ 클라이언트의 Request 데이터를 받아올 DTO(Data Transfer Object) 디렉터리 생성

DTO 사용 이유 : API 간 필요한 데이터만 주고받을 수 있도록(노출 ↓) ==> https://www.okta.com/kr/identity-101/dto/

 

데이터 전송 객체(DTO) 정의 및 사용 방법 | Okta Identity Korea

데이터 전송 객체(DTO)는 데이터 전송에 사용되는 설계 패턴입니다. 여기에서 DTO 패턴이 무엇인지, 그리고 데이터 전송 객체의 작동 원리에 대해 알아보세요.

www.okta.com

 

<2> API 명세

귀찮아서 중괄호 생략..... 요청 url과 METHOD는 역할에 맞게.

같은 api/article/{id}로 PUT요청, DELETE요청에 따라 Controller에 의해 다른 메서드로 매핑된다.

REST 설계에서 요청 URL의 / 구분은 하나의 계층을 나타내도록 하고 있다.

 

<3> Entity, Repository 작성

Article entity

Entity는 NoArgsConstructor가 있어야함

 

ArticleRepository를 만들어주고 JPA를 연동함

이제 이 ArticleRepository 클래스를 내 데이터베이스처럼 사용할 수 있다.

 

<4> Controller 적절하게 만들어주기

ArticleController 클래스 안의 요청들은 /api를 타고 오도록 @RequestMapping

각 요청은 METHOD에 맞게 작성하면 되고, 변수는 클라이언트의 요청에 따라 적절하게 받아준다.

Controller에서는 적절한 DTO를 사용하여 클라이언트의 요청을 받고, 이에따른 적절한 Service함수를 호출한다.

Service에서 적절한 작업을 마치고 넘어온 DTO를 다시 클라이언트에게 반환해주면 끗

 

<5> Service 작성

클래스 내에 알맞은 Repository를 final 변수로 가지고, 들어오는 요청과 서비스로직에 따라 Repository에 CRUD 해준다.

작업을 마치면 ResponseDto에 담아 다시 Controller로 내려준다.

 

 

<PostMan으로 확인해보기>

https://web.postman.co/workspace

 

Postman API | Postman Public Workspace

The Postman API enables you to programmatically access data stored in your Postman account. Getting started You can get started with the Postman API by forkin

www.postman.com

가입하고, workspace 열어준다.

로컬환경에서 테스트해볼 경우, 오류가 나고 아래에 Postman agent 설치하도록 나온다.

설치해주면 localhost에 요청보낼수있다.

요청 URL과 METHOD를 알맞게 입력 후, 요청데이터를 담아보낼 방법을 선택한 후, 그에맞게 입력

오른쪽 SEND버튼을 누르면 아래에 응답이 뜬다.

네이버 코딩테스트 응시함.

https://imslo.tistory.com/39

 

네이버 코딩테스트 응시

부트캠프 시작 전 삼성 SCSA 전형에 지원했고, 부트캠프 1주차에 경험삼아 네이버에 지원했다. 4/15 9:00 ~ 10:30 삼성 GSAT 예비소집 일정이 생겼고, 네이버 코테는 같은 날 10:00에 시작이었다. 삼성 예

imslo.tistory.com

 

Spring boot 입문 하였는데, 생각보다 어려웠다.

 

HTTP(HyperText Transfer Protocol)를 통해 클라이언트와 서버 간의 통신을 배웠으며,(https://imslo.tistory.com/38)

 

이러한 통신을 Spring MVC 패턴을 통해 처리하는 과정을 경험했다. (https://imslo.tistory.com/41)

 

특히, Spring에서 @Controller가 어떻게 동작하는지를 공부할 때 흥미로웠다.

 

URL에 요청이 들어왔을 때, 그것을 지정된 메서드에 매핑해주는 것이 @Controller인데, 간단해보이는 개념이지만 Spring

 

내부적으로는 Servlet에 내용이 전달되고, Handler가 이를 받아 처리하여 Controller에 보내준다. 

 

Spring이 어떤 과정을 편리하게 만들어주고 있는지 알게되어 흥미로웠다.

'일기 > 주간회고' 카테고리의 다른 글

주간 회고  (0) 2023.05.01
일기 겸 개발 부트캠프 일주일차 후기  (0) 2023.04.01

Springboot 및 서버 이해 // SQL // JPA  

https://imslo.tistory.com/41

 

 

SpringBoot 및 서버 이해 // SQL // JPA

서비스가 커지고 문제가 복잡해질수록, 이를 처리하기 위한 소프트웨어의 아키텍쳐적인 부분이 중요해진다. 내가 진행했던 토이프로젝트의 서버는 크게 세 가지 일을 했다. -새로운 데이터를

imslo.tistory.com

Spring MVC 패턴 이해하기

https://imslo.tistory.com/55

 

Spring MVC 패턴 이해하기

Model - View - Controller의 디자인 패턴. 비지니스 로직과 화면을 구분하는 데 중점을 두고있다. Model : 데이터와 비지니스 로직을 관리 View : 레이아웃과 화면을 처리 Controller : 사용자의 요청을 필요

imslo.tistory.com

IntelliJ 콘솔창 한글 깨짐

https://imslo.tistory.com/40

 

IntelliJ 콘솔창 한글 깨질때

https://www.lesstif.com/java/intellij-file-console-encoding-121012310.html

imslo.tistory.com

알고리즘

https://imslo.tistory.com/43

 

[프로그래머스 lv.2 - 150368] 이모티콘 할인행사 // Java 재귀, DFS

https://school.programmers.co.kr/learn/courses/30/lessons/150368 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

imslo.tistory.com

 

https://imslo.tistory.com/36

 

[프로그래머스 lv.2 - 72412번] 순위 검색 // Java Map, Regex, BinarySearch 활용

https://school.programmers.co.kr/learn/courses/30/lessons/72412 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

imslo.tistory.com

 

https://imslo.tistory.com/37

 

[프로그래머스 lv.2 - 64065] 튜플 // Java regex, Comparator 활용

https://school.programmers.co.kr/learn/courses/30/lessons/64065 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

imslo.tistory.com

 

+ Recent posts