스프링 24

[프로젝트] 스프링에서 채팅 기능 구현해보기

1. 채팅 기능을 왜 구현하게 되었나? 현재 진행하고 있는 프로젝트에서 사용자들끼리 1:1로 대화를 하는 기능이 필요하다. 이를 소켓을 활용한 채팅 기능이 아닌 그냥 일반적으로 글을 주고 받는 쪽지 형식으로 구현해도 되긴 했으나 소켓으로 채팅기능을 구현해보는 걸 이번 기회 아니면 언제 해보겠냐는 생각에 적용해보기로 하였다. 다행히 프론트엔드 개발자 분도 동의해주셨다. 2. 근데 socket이 뭔데 추후 정리 3. 채팅 기능 구현을 위한 의존성 implementation 'org.springframework.boot:spring-boot-starter-websocket' 4. socket 처리를 위한 핸들러 추후 정리 5. 내가 구현할 채팅 환경 및 이를 위해 필요한 엔티티 정리(+레포지토리) 1) 환경 ..

[프로젝트] 카카오페이 api 스프링에서 사용하는 법

0. 왜 카카오페이 api를 사용하게 되었나? 현재 진행하고 있는 프로젝트에서 상품을 주문한 후 결제하는 기능이 필요했다. 실제로 결제가 되는 과정을 거치면서, 사용자들이 편하게 결제할 수 있는 방법에는 뭐가 있을까 생각하다 api를 가져다 쓰면 좋겠다는 생각이 들었고, 주위에서 사용빈도가 높은 카카오페이 api를 사용하면 사용자들이 편하게 결제를 진행할 수 있겠다는 생각을 하게 되었다. 그래서 카카오페이 api를 프로젝트에 적용해보고자 하였다. 아래는 카카오페이 api를 스프링 및 스프링부트에서 사용하기 위한 방법이다. 흐름 정리 프론트엔드가 백엔드에게 결제 정보를 담은 후 api1를 요청한다. 그러면 백엔드는 api1에 대한 처리로 카카오페이 서버에게 결제를 하고 싶다는 요청을 보내고 응답으로 결제를..

[프로젝트] ServiceInterface와 ServiceImpl

스프링에는 Service 계층이 있다. 이러한 Service 계층을 구현할 때는 그냥 기능별 Service 클래스를 만들어 구현을 하는 방법이 있고, 기능별로 ServiceInterface를 만들고 해당 Interface를 구현하는 ServiceImpl을 구현하는 방법이 있다. 이 두 방법에 대해 살펴보고 나의 프로젝트에 맞는 방법에 대해 고찰해보고자 한다. 1. ServiceImpl을 사용하는 방법 1) 개념 Service 별로 interface를 만들고, 해당 interface를 구현한 실제 serviceImpl를 만든다. BoardServiceInterface를 만들어서 create라는 메서드를 명시하고 BoardServiceImpl을 만들어서 create 메서드를 실제로 구현하는 것. 2) 장점 ..

[프로젝트] 객체 생성 방법(생성자, getter setter, 빌더)

1. 서론 어떤 클래스를 만들고 해당 클래스를 사용해서 속성 값을 가지고 있는 인스턴스를 만드려고 할 때 흔히 사용하는 방식에는 생성자를 사용하는 방식, setter로 속성 값을 설정해서 생성하는 방식, builder를 사용하는 방식이 있다. 예전에 get과 set 메서드만 알고 있을 때는 set으로 값을 설정하는 방법을 사용했는데 @builder 어노테이션이 있다는 것을 알게 되고 난 후, 각 방식에 대해 궁금해졌다. 각 방식의 특징은 무엇이고 어떤 방법이 이번 내 프로젝트에 적당할까? 2. 각 방식에 대해 알아보기 1) 생성자 사용 ① 사용 방법 public class Car { private int price; private String owner; public Car(int price, Strin..

[스프링] 의존성 주입

1. 개념 어떤 서비스를 개발한다고 생각해보자. 특정 서비스에는 다양한 기능들이 있고, 다양한 기능을 개발하기 위해서는 다양한 클래스가 필요하다. 기능 별로(로그인, 회원가입, 글 작성 등) 클래스가 분류될 것이고, 그 기능 안에서 service, controller, repository, entity 등 세부 기능으로 또 클래스가 분류된다. 이렇듯 우리는 스프링으로 서비스를 개발할 때 아주아주 다양한 클래스를 접하게 된다. 나는 앞으로 class 하나 하나를 컴포넌트라고 이야기 하려고 한다. 예를 들어 회원가입 기능을 생각해보자. 이를 위해서는 controller, service, repository, passwordEncoder 등의 컴포넌트가 필요하다. controller는 service컴포넌트가 ..

Spring/spring 2023.04.07

[시큐리티] OAuth2 - 승인 코드 그랜트 유형 깃허브로 연습

전제 조건 권한 부여 서버와 리소스 서버로 깃허브를 사용한다 클라이언트는 내가 작성한 스프링 백엔드 코드다 사용자는 깃허브를 사용하면서 내가 작성한 스프링 백엔드 코드에 접근한 사람이다 1. 권한 부여 서버에게 클라이언트를 알리기 깃허브에서 클라이언트의 이름, 홈페이지, 깃허브가 클라이언트를 다시 호출할 링크를 지정하기 양식 입력 후 클라이언트 ID와 클라이언트 비밀을 얻을 수 있다 2. 클라이언트에 인증 방식으로 OAuth2를 사용할 것이라고 선언하기 build.gradle 혹은 pom.xml에 OAuth2 의존성을 주입해야 한다 dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' } conf..

Spring/security 2023.03.31

[시큐리티] OAuth 2

1. 개념 권한 부여 프레임워크. 내가 만든 서비스에서 구글이나 네이버 같은 다른 플랫폼의 사용자 정보에 접근하기 위한 권한을 위임 받을 수 있도록 해주는 것. 2. 구성 요소 1) 리소스 서버 내가 만든 서비스에서 다른 플랫폼의 사용자 정보에 접근하려고 할 때, 다른 플랫폼의 사용자 정보를 리소스라고 한다. 그리고 이러한 리소스를 제공해주는 서버가 리소스 서버이다. 즉, 구글이나 네이버 같은 플랫폼의 서버가 리소스 서버라고 할 수 있다. 2) 사용자(리소스 소유자) 내가 만든 서비스를 사용하는 사용자이면서, 구글이나 네이버 같은 다른 플랫폼을 사용하여 그 플랫폼의 리소스를 소유하고 있는 사람 3) 클라이언트 사용자를 대신해 리소스 서버에 접근하는 주체로, 보통 내가 만든 서비스를 의미한다. 4) 권한 ..

Spring/security 2023.03.30

[시큐리티] 토큰

1. 개념 클라이언트가 애플리케이션의 자원에 접근할 수 있도록 해 주는 일종의 출입카드. 이것이 있어야 원하는 자원(엔드포인트)에 접근해서 자원을 얻을 수 있다. 서버가 클라이언트의 인증을 확인하는 방법 중 하나. 2. 작동 클라이언트가 본인의 아이디와 비밀번호를 서버에게 보내면서 나는 올바른 회원이니 토큰(출입카드)를 달라고 요청한다. 서버는 이 요청을 보고 저 회원이 올바른 회원인지 확인한 후, 올바른 회원이면 토큰을 주고 올바르지 않은 회원이면 토큰을 주지 않는다. 이때, 토큰을 준다면 건네준 토큰을 서버는 어딘가에 저장해 놓는다. 나중에 클라이언트가 토큰을 보냈을 때 올바른 토큰인지 검사가 필요하기 때문에. 클라이언트는 아까 받은 토큰을 가지고 있다가, 엔드포인트를 호출할 때(api를 호출해서 자..

Spring/security 2023.03.29

[시큐리티] CORS

1. 개념 CORS는 cross origin resource sharing의 줄임말이다. 여기서 origin은 프로토콜(http), 도메인(naver.com), 포트번호(8080)을 합친 것을 의미한다. 즉 CORS는 서로 다른 여러 origin끼리 자원을 공유할 수 있도록 해주는 정책이다. 이는 원래대로라면 SOP에 의해 막히게 될 요청을 풀어주는 것이다. SOP란 same origin policy의 줄임말로, 다른 origin으로 요청을 보내는 것을 금지하는 정책이다. 요즘 다른 origin으로 요청을 보내야 할 필요성이 커지자 CORS가 나타나게 된 것. 예를 들어, 백엔드에서 글을 작성할 수 있는 /post/write api를 만들었다고 하자. 만약 CORS가 적용되어 있지 않는다면, SOP에 의..

Spring/security 2023.03.28

[시큐리티] CSRF

1. 개념 사용자 A, A가 사용하는 서비스 B, 공격자 C가 있다고 하자. A는 B에 로그인을 한다. 로그인 된 상태로 A는 C가 보낸 이상한 링크를 통해 어떤 사이트에 접속한다. 이 사이트에는 B에 광고성으로 글을 올릴 수 있는 위조된 코드가 들어있다. A가 B에 로그인을 한 상태로 위조된 코드가 있는 사이트에 들어갔는데 만약 B가 요청이면 무조건 승낙을 하는 보안 정책을 가지고 있다면 B에는 위조된 요청에 의해 A의 계정으로 광고성 글이 작성된다. 이처럼 위조된 요청으로 서버에 어떤 작업을 시킬 수 있는 것이 CSRF이다. 2. 보호 방법 1) csrf 토큰 get요청이 들어왔을 때 서버가 고유한 csrf 토큰을 생성해서 클라이언트에게 보내고, 클라이언트는 이후 post, put, delete 등의..

Spring/security 2023.03.27