목록개발 공부/Spring (18)
Just Do IT!

비동기 처리를 적용하는 배경 SODA 프로젝트 진행 중, 프로젝트 생성 횟수 추이를 그래프로 보여주기 위해 API를 만들어야 했었다.이 기능을 구현하기 위해 두 가지를 고민했었다.실제 DB에서 전체 조회해서 생성일에 맞춰서 카운트해서 조회하기스프링배치를 이용해 통계 테이블을 따로 생성해서 거기에 하루에 한번씩 카운트 저장하기첫 번째 방법은 너무 비효율적이라 생각만 하고 바로 지워버렸고 두번째가 적합하다고 생각했었다.왜냐면 규모가 커진다면, 하루에 프로젝트를 생성하는 횟수가 많아질 거라고 생각했고 생성할때마다 매번 통계 테이블에 저장하는 것보다는스프링 배치를 적용헤 일정한 시간에 한 번에 저장하는 게 더 나을 것이라고 생각했기 때문이다. 실제로 주말 내내 스프링 배치를 적용해서 테스트해보면서 잘 적용되는 ..

데이터 흐름사용자가 브라우저에서 데이터를 입력하여 DTO 형태로 서버에 전송서버는 이 DTO를 받아 DAO를 통해 데이터베이스에 저장데이터를 조회할 때 DAO를 통해 데이터베이스에서 데이터를 가져와 DTO로 클라이언트에게 반환 Spring Boot 에서의 활용Repository : DAO 역할을 한다Controller : DTO를 받아 서비스 계층으로 전달하거나, 서비스 계층에서 받은 데이터를 DTO로 변환하여 클라이언트에게 반환한다추가 구조 보러가기: https://daydream-sy.tistory.com/333 DTO (Data Tranfer Object)계층 간(Controller, View, Business Layer / Spring Boot에서는 뷰, 컨트롤러, 서비스, DAO, DB..

지난 주에 window 환경에서 redis 를 설치하는 글을 썼었다.https://daydream-sy.tistory.com/360 [Redis] Window 환경에서 Redis 설치하기공식 문서https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-windows/ Install Redis on WindowsUse Redis on Windows for developmentredis.io 내 노트북은 window라 window에서 설치하기 부분을 찾아봤daydream-sy.tistory.com 그런데,스프링 프로젝트에 redis 적용한 부분이 있는데 실제로 실행해보니 계속 redis 관련 오류가 나는 ..

프로젝트를 진행하는데,특정 엔티티를 삭제할 때 연관된 엔티티를 전부 삭제하도록 해야 하는데 제대로 되지 않았다. 이 부분을 팀원분이 해결해주셨고, 나는 그걸 참고해서 내가 맡은 문제집 쪽 삭제 로직을 수정하였다. https://daydream-sy.tistory.com/358 JPA Cascade 알아보기Cascade란? 부모 엔티티가 영속화될 때 자식 엔티티도 같이 영속화되고, 부모 엔티티가 삭제될 때 자식 엔티티도 삭제되는 등 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태daydream-sy.tistory.com 여기서 정리했던 CascadeType.ALL과 orphanRemoval=true 옵션을 사용했고다른 로직도 일부 수정하면서 테스트 해본 결과 한번에 삭제되는 걸 알 수 ..

Cascade란? 부모 엔티티가 영속화될 때 자식 엔티티도 같이 영속화되고, 부모 엔티티가 삭제될 때 자식 엔티티도 삭제되는 등 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 전이되는 것을 의미한다. JPA에서는 영속성 전이를 Cascade 옵션을 통해 설정하고 관리할 수 있다.JPA Cascade를 활용하면 ‘어떤 엔티티와 다른 엔티티가 밀접한 연관성이 있을 때’에 대한 관리가 매우 수월해진다. 예를 들어,문제와 문제에 대한 댓글이 있다고 가정해보자.문제와 댓글은 연관 관계에 있는 것이다. 이 두 연관 관계의 관리를 하는 데 cascade가 유용하게 사용된다. Cascade 옵션ALLPERSISTMERGEREMOVEREFRESHDETACHcascade는 여섯 가지 옵션..

프로젝트에 북마크 기능이 있는데, boolean을 이용해서 삭제 여부를 update하는 soft delete를 구현하기로 했다.북마크 db가 따로 있고 로그인한 사용자가 특정 문제집을 북마크하는 것이다. 처음 북마크를 한다면 db에 새로운 북마크가 생성되고,북마크를 취소하는 경우 is_deleted가 true로 업데이트 되는 형식이다. 기능 구현 전에 api 명세서를 작성할 때는POST /api/books/{id}/bookmarkUPDATE /api/books/{id}/bookmark이렇게 두 가지를 따로 작성했었는데 토글 방식으로 구현할 수 있지 않을까 하다가 참고할만한 글을 발견해서적용해보았고 포스트맨으로 테스트까지 마쳤다. BookmarkResponse 생성@Getter@Builder@..

ControllerAdvice전역적으로 ExceptionHandler를 적용할 수 있는 @ControllerAdvice와 @RestControllerAdvice 어노테이션을 제공하고 있다.@ControllerAdvice는 여러 컨트롤러에 전역적으로 ExceptionHandler를 적용해준다만약 특정 클래스에만 제한적으로 적용하고 싶다면 @RestControllerAdvice의 basePackages 등을 설정함으로 제한할 수 있다.@RestControllerAdvice는 @ControllerAdvice와 다리 @ResponseBody가 붙어 있어 응답을 JSON으로 내려준다 @RestControllerAdvice 와 @ControllerAdvice 의 특징과 차이@RestControllerAdvice 는..

H2 Database를 사용하는 이유?H2 DB는 In-Memory DB로 스프링 애플리케이션과 함께 실행되며, 매우 가벼운 용량을 가지고 있다.복잡한 mocking 없이도 서비스 및 레포지토리 레이어를 테스트할 수 있기 때문에 mocking으로 인한 부분적인 오류나 가짜 성공(실 서비스에서는 오류가 발생하지만 mocking으로는 성공으로 표기되는 상황)을 방지할 수 있다.테스트 과정에서 데이터가 영향을 받지 않도록 한다.만약 다른 Database를 사용하는 경우, 테스트 데이터가 롤백되어 DB에 남아있지 않아도 auto increment로 지정한 id가 계속 증가되는 등의 문제가 발생할 수 있다.=> 테스트용 DB가 따로 필요하다.기존 Database 대신에 H2 Database를 이용하여 테스트를 하..

월요일부터 JWT 실습을 하고 있는데 token을 두 가지로 발급하는 이유에 대해 정리해보고자 한다. JWT 토큰 인증 방식어제 블로그글에도 정리했지만 JWT 토큰 인증 방식은 비밀키로 암호화를 해서 안전하게 통신한다.JWT 토큰이 유저의 신원이나 권한을 결정하는 정보를 담고 있는 데이터 조각이니까. JWT는 헤더, 페이로드, 서명 세 가지 정보를 base64로 인코딩한 값을 콤마('.')를 사이에 두고 이어붙인 형태로 생성된다.헤더: JWT 서명에 사용된 알고리즘을 담는다.페이로드: 토큰에 담긴 주체(Subject), 만료일(exp), 생성자(iss) 등을 담는다.시그니처: 헤더와 페이로드를 각각 base64로 인코딩한 후 콤마로 이어붙인다. 그리고 이를 헤더에 명시된 알고리즘으로 암호화한 값을 담는다..

토큰 기반 인증이란?토큰 기반 인증은 토큰을 사용하는 방법이다.토큰 : 서버에 요청을 받을 때, 요청을 보낸 클라이언트를 구분하기 위한 유일한 값서버가 토큰을 생성해서 클라이언트에게 제공하면, 클라이언트는 해당 토큰을 보관하고 있다가 여러 요청을 토큰과 함께 보내게 된다.그러면 서버는 토큰을 보고 해당 클라이언트가 유효한 사용자인지 검증하고, 요청을 처리해주게 된다. JWT?발급받은 JWT를 이용해 인증을 하려면 HTTP 요청 헤더 중에 Authorization 값에 Bearer + JWT 토큰값을 넣어서 보내야 한다.JWT는 .을 기준으로 헤더(Header), 내용(Payload), 서명(Signature)으로 구성되어 있다.JWT 구성헤더 : 토큰의 타입과 해싱 알고리즘을 지정하는 정보내용 : 토큰과..