springboot 8

연습용 주문 서버 만들기 02 멤버십 발급 API 작성하기

연습용 주문 서버 만들기 git repository 01 Kotlin/Spring 멀티모듈 프로젝트 구성 02 멤버십 발급 API 작성하기 03 메뉴 목록 조회 API 가장 간단한 아이디 발급 API부터 만들겠습니다. 지난 번 글에도 말했듯이 편의상 회원가입없이 아이디 발급 요청하면 임의의 UUID를 발급하겠습니다. 이 아이디를 membership이라고 하겠습니다. 사용자는 나중에 발급받은 membership를 가지고 포인트를 충전하거나 결제할 수 있습니다. 구현할 요구사항은 아래와 같습니다. 사용자는 누구나 membership 발급 API를 통해 멤버십 번호를 발급받을 수 있다. 따로 무엇을 검증하지 않을 것이므로 매우 간단한 구현이 되겠습니다. 아이디 발급은 실패하는 케이스가 없다고 가정하겠습니다. ..

Spring 2023.01.15

Springboot 통합 테스트로 불안한 리팩토링에서 벗어나기

통합테스트를 작성한 경험을 기록했습니다. 아래와 같은 순서로 말해보겠습니다. 통합테스트 작성 계기 웹 레이어 테스트와 통합테스트 웹 레이어 테스트 작성 통합 테스트 작성 군말 통합 테스트 작성 계기 제가 참여하는 프로젝트는 구조를 크게 3계층으로 나눌 수 있습니다. 아주 흔한 구조입니다. Web Service Repository 저는 이중에서 서비스 레이어에 대한 단위 테스트만 집중해서 작성했습니다. (모든 레이어를 꼼꼼하게 테스트해야 한다고 생각하지만 내부적인 협의점이 그것이었습니다.) 라이브러리에 의존하는 단위 테스트를 하면서 가장 불편했던 점은 프로덕션 코드를 변경하면 테스트 코드를 함께 변경해야 한다는 것이었습니다. 간단한 예시를 들어보겠습니다. 불필요한 부분은 생략하겠습니다. //제품 코드 fu..

Spring 2022.08.24

인프런 Kotlin으로 개발하는 Spring Boot Web MVC - Web개론

Web이란? 웹은 인터넷에 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 전 세계적인 정보 공간이다. 웹의 용도는 다양하게 나눌 수 있다. Web site(google, naver, ...) User Interface(Browser) API(ex.Open API) 이 세 가지 정도가 가장 흔하게 접할 수 있는 웹의 형태다. 웹의 기반 HTTP HTML을 주고 받기 위한 규약 URI 리소스 식별자다 HTML XML을 바탕으로 한 범용 문서 포맷. 브라우저는 HTML을 사용자가 알아볼 수 있는 형태로 표현하는 도구다. REST Client, Server 클라이언트와 서버가 서로 독립적으로 분리되어야 한다. Stateless 요청에 대해 클라이언트의 상태가 서버에 저장하지 않는다. Cache 클라이언트..

Study 2021.05.15

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록 개인 프로젝트에 좋아요 기능을 추가했다. Springboot2.3.1, SpringDataJPA, Querydsl을 사용하여 구현했다. 테스트는 JUnit5로 진행했다. 코드는 전체 코드는 github에서 확인할 수 있다. 화면 처리나 환경설정은 이 글에서 다루지 않는다. 내가 생각한 요구사항은 다음과 같다. 사용자는 게시물에 좋아요를 누를 수 있다. 사용자는 자신의 좋아요를 취소할 수 있다. 사용자는 자신이 좋아요를 누른 게시물을 조회할 수 있다. 사용자는 게시물 당 한 번만 좋아요를 누를 수 있다. 사용자는 전체 게시물을 조회할 때 좋아요 카운트를 확인할 수 있다. 우선 구현을 위해 세 개의 엔티티(테이블)가 필요하다..

Spring 2021.02.07

JPA Auditing으로 생성 시간/수정시간 자동화

JPA Auditing으로 생성 시간/수정시간 자동화 Java8버전부터 LocalDate와 LocalDateTime이 등장했다. LocalDate가 나오기 전 Date나 Calendar클래스에는 다음과 같은 문제가 있었다. 불변 객체가 아니어서 멀티 쓰레드 환경에서 문제가 발생할 수 있었다. Calendar는 월(month) 설계가 잘못 되었다. 10월을 나타내는 Calendar.OCTOBER의 숫자 값이 10이 아니고 9였다. 이러한 문제점을 LocalDate가 해결했다. JPA Auditing사용하기 @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class BaseTimeEntity { @CreatedDa..

Spring 2020.09.15

등록/수정/조회 API

이전 글에서 이어지는 글입니다. 등록/수정/조회 API 해당 API를 만들기 위해 3개의 클래스가 필요하다. Request 데이터를 받을 DTO API 요청을 받을 Controller 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service 서비스 계층에서 비즈니스 로직을 처리해야 한다는 생각은 오해다. 서비스는 트랜잭션, 도메인 간 순서만 보장한다. DTOs DTO(Data Transfer Object)는 계층 간 데이터 교환을 위한 객체를 말한다. Domain Model 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고, 공유할 수 있도록 단순화시킨 것을 도메인 모델이라고 한다. 택시 앱이라면 배차,탑승,요금 등 모두 도메인이 될 수 있다. @entity가 사용되는 영역 역..

Spring 2020.09.14

Spring Boot 게시판 만들기

참고 도서 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 Spring Boot 게시판 만들기 요구사항 분석 기능 조회 등록 수정 삭제 회원 구글 / 네이버 로그인 로그인한 사용자만 글 작성 본인이 작성한 게시물 권한 관리 사용 기술 Spring 2.3.3 H2 JPA Hibernate Entity를 만들 때 참고 사항 PK는 Long타입으로 잡고 Auto_increament로 잡는 게 좋다. 복합 키나, 유니크 키 기타 다른 키를 PK로 잡을 경우 아래와 같은 문제가 발생할 수 있다. FK를 맺을 때 다른 테이블에서 복합키 전부를 갖고 있거나, 중간 테이블을 하나 더 둬야 하는 상황이 발생한다. 인덱스에 좋은 영향을 끼치지 못한다. 유니크한 조건이 변경될 경우, PK전체를 수정해야 할 수도 있다. ..

Spring 2020.09.14

Spring Data JPA

JPA 스프링 레거시 프로젝트에서는 MyBatis를 이용해 Mapper를 만들고 직접 쿼리를 만들었다. 쿼리를 만들 때는 그 쿼리가 제대로 작동하는 지, 우선 해당 데이터베이스에서 직접 테스트하고, 코드에 적용했다. 간단한 CRUD 정도는 문제가 되지 않았지만, 그것도 쌓이면 나름 시간이 걸리는 일이다. 무엇보다 여러 개의 테이블을 join해서 작업하는 경우에는 쿼리를 짜는 데에만 꽤 오랜 시간이 걸렸다. 책에서도 "실제 개발 시간보다 SQL을 다루는 시간이 더 많았"다. "테이블 모델링에만 집중하고 객체를 단순히 테이블에 맞추는 기형적인 형태"였다고 설명한다. 내가 생각하기에 데이터는 거의 모든 것이다. 복잡하게 생각할 것도 없이 자명하다. 객체를 이용해 데이터를 운반하지만, 객체는 할 일을 마치면 가..

Spring 2020.09.14