본문 바로가기

Spring

(11)
Spring / CQRS, 코드로 알아보기 CQRS를 검색해 보면 관련된 글들이 많이 나온다. Query와 Command를 나눈다는 이야기인데 이것만으로는 실제 CQRS를 적용하기 위해서는 더 구체적으로 알아야 할 필요가 있다. 이번 포스팅에서는 CQRS가 필요한 구체적인 예시와 더불어 어떻게 구현하는지에 대한 간단한 예제를 다뤄보려 한다. 목차 1. 프로젝트 구조 설정 2. 문제점 및 한계 3. CQRS 적용 3-1. Query 모델 만들기 3-2. Query 모델과 Command 모델 동기화 프로젝트 구조 설정 '학생기록부' 시스템이 있다고 가정해 보자. Entity는 학생, 부모(각각 아버지, 어머니)가 있고 영어 성적, 수학 성적으로 구성되어 있다. 그리고 학생의 아래 정보들을 요구하는 api 있다고 가정해 보자 @AllArgsConstr..
@TransactionalEventListener 사용시 주의할 점(feat. Entity 수정 삭제) 모든 코드는 Github 에 있습니다. 0. 들어가기에 앞서 다음과 같은 요구사항이 있다. 1. 회원 탈퇴를 할 수 있다. 2. 탈퇴시 해당 회원의 구독 정보가 삭제된다. 이를 아래와 같이 이벤트 방식으로 구현했을 때 과연 아래 코드는 잘 동작할까? 서비스 코드 @Service public class MemberService { private final MemberRepository memberRepository; private final ApplicationEventPublisher eventPublisher; public MemberService(MemberRepository memberRepository, ApplicationEventPublisher eventPublisher) { this.mem..
JPA OneToMany 단방향 맵핑의 단점 이해하기 삽질기 JPA OneToMany 단방향 맵핑의 단점 이해하기 삽질기 JPA의 연관관계 설정에는 크게 4가지가 있습니다. OneToOne OneToMany ManyToOne ManyToMany 프로젝트를 진행하던 중 OneToMany에 관해 고민하게 되는 일이 있었고, 여러가지 글을 참고하기도 했습니다. 그 과정에서 겪었던 시행착오를 공유해볼까합니다. OneToMany 단방향이 안 좋다고요? 구글에 OneToMany 단점을 검색만 해봐도 많은 자료들이 나옵니다. 정리하자면 다음과 같습니다. 엔티티가 관리하는 외래 키가 다른 테이블에 있음 => 작업한 Entity가 아닌 다른 Entity에서 쿼리문이 나가는 경우가 있어 헷갈림 불필요한 쿼리문이 발생(update 등) (join table 문제도 있지만 이 글에서는..
스프링부트 / Fetch API를 이용하여 checkbox 다중값 백엔드로 전달하기 checkbox 다중값 벡엔드로 전달하기 이번 포스팅에서는 프론트에서 checkbox에 체크해준 여러개의 값들을 비동기 통신으로 백엔드에 전달하는 방법에 대해서 알아보려고 합니다. 사용된 통신방법은 Fetch API이며 javascript를 사용하고 있습니다. Html Code 다음과 같이 밴드 포지션을 체크하는 항목들이 있습니다. 포지션 보컬 피아노1 피아노2 일렉 베이스 드럼 JavaScript Code 데이터를 전송하는 버튼을 눌렀을 때 동작하는 자바스크립트 함수가 있을 것입니다. 첫 단계로 그 함수 안에 체크박스 중 체크한 것들을 가져오는 변수를 만듭니다. var $positions = document.querySelectorAll(".position-checkbox:checked"); 보컬과 일..
스프링부트 / Spring Rest Docs 를 통한 문서 자동화 Tutorial Spring Rest Docs📜 를 통한 문서 자동화 Spring Rest Docs? Spring Rest Docs는 rest API 를 문서화하는데 도움을 주는 도구입니다. 전체적인 흐름은 다음과 같습니다. 1. 테스트 코드를 실행하면 snippets라는 문서에 사용될 조각들이 생성된다. 2. 조각들을 사용자가 의도하는 대로 템플릿에 넣는다. 3. 템플릿을 기준으로 html파일을 생성한다. 이번 포스팅에서는 간단한 예제를 통해 Spring Rest Docs를 이용한 문서 자동화를 익혀보려고 합니다. 준비하기 Spring Rest Docs를 이용하기 위해 몇가지 준비사항이 있습니다. gradle 의존성주입 plugins { ... id "org.asciidoctor.convert" version "1.5..
스프링부트 / JWT 방식으로 로그인 구현하기 Token 방식으로 로그인 구현하기 🔸 Session/Cookie 방식 vs Token 방식? 사용자 인증 방식에는 크게 Session 방식과 토큰 방식이 있습니다. Session / Cookie 방식 Session 방식은 사용자가 로그인 요청을 보내면 사용자를 확인 후 Session ID를 발급하고 그 발급한 ID를 이용하여 다른 요청과 응답을 처리하는 방식입니다. 하지만 이 경우, 프로그램이 커져서 관리하는 Session 이 늘어날 경우 별도로 세션 저장소를 관리해주어야 하는 번거로움이 있습니다. Token 방식 그에 반해 Token 방식은 저장소의 필요 없이 로그인 시 토큰을 발급하고, 데이터 요청 시에 발급받은 토큰을 헤더를 통해 전달하여 응답을 받는 방식으로 진행됩니다. 이번 포스팅에서는 스프링..
Spring / @RequestBody vs @RequestParam 이해하기 컨트롤러에서 데이터를 인자에 할당하는 대표적인 방법으로는 @RequestBody 와 @RequestParam 이 있다. @Controller public class UserController { @PostMapping("/receive") public String age(@RequestParam String name) { System.out.println("통신 성공"); System.out.println(">>> " + name); return "index"; } } @Controller public class UserController { @PostMapping("/receive") public String age(@RequestBody String name) { System.out.println("..
스프링부트 어노테이션 / @PathVariable @PathVariable? import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @Controller public class UserController { @GetMapping("/user/{userName}") public String user(@PathVariable String userName){ System.out.println(userName); return "index"; } } @PathVariable 사용의 예시이다. 여기서 주목해야할 점은 @..