spring boot 사이드 프로젝트 : 채팅기능을 위한 stomp 적용

프로젝트의 요구사항 중 같은 프로젝트에 소속되어있는 인원들끼리 이용할 수 있는 채팅방을 구현해야하는 요구사항이 있었다. 이를 구현해보기 위해 공부한 내용을 정리한다.  rest api 를 사용한 프로젝트에서 채팅은 http를 이용해서 구현할 수 있을까? 가능은 해도 매우 비효율적일 것이다. 이는 http의 특성을 보면 알 수 있다. 1.  클라이언트 - 서버 구조 : 서버에서는 클라이언트의 요청이 와야 응답을 한다. 그 전까지 서버는 대기한다. 2. stateless  :  http를 이용해 클라이언트에서 서버로 한 번 요청과 응답을 주고 받았어도, 서버에서는 http 요청했던 클라이언트의 상태를 저장하지 않는다. 3. connectionless : 한 번 요청 후 응답을 받으면 클라이언트와 서버 간 연..

개인 프로젝트 2024.02.20 0

spring security : refresh 토큰 구현(redis 활용)

jwt 토큰을 통해 로그인을 구현하면 세션에 비해 서버에 부담이 적고, 확장하기도 편리하다는 장점이 있다. 하지만 온전히 사용자가 보내는 http 메시지에 담긴 토큰을 기반으로 서버가 유저를 판단하기 때문에, 이 토큰이 탈취당하면 탈취자를 사용자로 오인하게 되어 매우 위험하다. 프로젝트에서 이를 극복하기 위해 refresh 토큰을 도입했다. Refresh Token 이란? 이전에 작성한 jwt토큰을 이용한 로그인 방식은 엄밀히 보면 access를 위한 토큰이라 볼 수 있다. 그래서 사람들은 보통 이 토큰을 access token이라 지정하는 경우도 많다. 문제는 이 토큰이 탈취당하면 리스크가 크다는 점인데, 이는 access 토큰의 유효시간을 짧게 설정해서 보완할 수 있다. 유효시간이 짧다면 공격하는 사..

spring security 2023.10.24 0

spring boot 사이드 프로젝트[4] : 도메인 엔티티, DTO 설계 및 특별한 패키지 구조

데이터베이스를 설계하기 위해 E-R다이어그램을 기반한 도메인 설계를 시작했다. 보통 스프링 부트 프로젝트들을 보면 service , controller, repository 이렇게 패키지를 나눠서 진행하는 경우가 많은데, 우리는 조금 다른 방식으로 진행했다. domain에 속하는 user, comment, post, profile을 먼저 만들고, 그 안에 controller, service , repository등을 만드는 것이다. 이 패턴의 장점은 각 엔티티와 연관된 레이어를 찾는 것이 굉장히 쉽다는 점이다. 단점은 필요 이상으로 패키지 개수가 늘어날 수 있다는 점인데, 나는 이 패턴을 통해 파일을 찾는 것이 더 유용하다 판단해서 이 방법을 선택했다. 도메인은 크게 User, profile, post,..

9uin 2023.05.22 0

spring security : jwt를 이용한 로그인 구현[1]

프로젝트를 하면서, 로그인을 구현해야하는 단계에 왔을 때, sns로그인을 이용해 간단하게 넘길지 아니면 직접 구현할지 팀원과 의논했다. spring security는 강의에서도 생각보다 자세하게 다루지 않아, 깊게 공부하려면 아예 따로 spring security강의를 찾거나 레퍼런스를 뒤지면서 처음부터 공부해야했다. 그래도 이왕 하는 김에, 처음부터 머리박으면서 구현해보는게 좋겠다는 생각으로 뛰어들었다. 로그인을 구현할 때, 먼저 세션과 토큰 방식 중 선택해야했다. 두 방식의 차이점은 크게 보면 세션은 유저 정보가 서버에 저장되고, 토큰은 유저 정보를 클라이언트에서 보낸다는 점이다. 우리는 토큰 방식을 선택했는데, 이는 다음과 같은 이유에서 였다. 1. 세션같은 경우, 유저 정보를 서버가 저장한다. 유..

spring security 2023.10.14 0

spring boot : entity <-> dto 변환 방법에 대한 고민( MapStruct 에 대해)

개요프로젝트를 진행하며 여러 layer사이에 데이터를 전달할 때, dto, entity 간 변경이 자주 일어나는 상황에 변환하는 코드를 일일이 적어넣는 것이 불편했습니다.   예시로 보면, member  한 명을 생성하는 post api는 다음처럼 작성되어 있었습니다.  @Controller@RequiredArgsConstructorclass MemberController { private final MemberService memberService; @PostMapping() public Member createMember(@RequestBody MemberDto memberDto){ //dto 사용 Member member = memberService.createM..

spring boot 2024.10.09 0