본문 바로가기

Backend

(37)
SpringBoot의 @IdClass를 사용해서 복합 Primary Key 적용하기 안녕하세요! 이번 포스팅에서는 SpringBoot의 @IdClass을 이용해서 복합키 매핑하는 방법에 대해 알아보도록 하겠습니다. @IdClass를 사용하는 이유 DB를 설계하다 보면 PK가 여러 개가 되는 경우가 종종 발생하곤 합니다. 그럴 때는 Primary Key에게 모두 @Id 어노테이션을 주면 되는데, 무작정 어노테이션을 붙이면 오류를 출력하게 됩니다. 이때 @IdClass를 사용하게 되면 복합키 매핑이 가능합니다. 프로젝트 설명 class라는 수강 현황을 저장해놓는 테이블이 있습니다. 이 테이블의 구조는 아래와 같습니다. 이 테이블과 매핑을 하기 위한 엔티티를 작성해보겠습니다. XXXid Class 추가 @IdClass를 사용하기 위해서는 PK 속성을 가지고 있는 컬럼들을 모아놓은 클래스가 필..
SpringBoot로 캐싱(Caching)하기 안녕하세요! 이번 포스팅에서는 SpringBoot의 spring-boot-starter-cache를 이용해서 메소드에 캐싱을 추가해보도록 하겠습니다. 코드는 Github에서 확인이 가능합니다. 캐싱? 캐싱을 사용해보기 전에 간단하게 캐싱에 대해 정리하자면, 들어오는 값을 기억해뒀다가 추후에 같은 값이 들어오게 되면 메소드를 돌지 않고 바로 결과값을 내놓는 것을 의미합니다. 캐싱에 대한 정확한 의미는 이곳을 참조하시면 됩니다! 이런 상황에서 캐싱을 유용하게 사용할 수 있습니다. 사용빈도가 높은 단순 반복 작업 결과가 자주 변경되지 않는 데이터 사전준비 프로젝트 설명 제가 캐싱을 할 메소드는 특정 코드를 문자열 값으로 바꿔서 리턴해주는 메소드입니다. S → "과자" D → "음료수" G → "껌" 이런 식으..
Java DateTimeFormatter을 사용하여 요일, 오전/오후 구하기 (+ 다른 나라 언어로 포맷팅 변경하는 방법) 안녕하세요! 이번 포스팅에는 자바의 LocalDateTime과 DateTimeFormatter을 사용해서 요일과 오전/오후를 구하는 방법을 알아보겠습니다. 종종 한글로 요일이나 오전/오후를 출력해야 할 때가 있는데, 생각처럼 잘되지 않아서 생각보다 엄청난 삽질을 한끝에 얻은 방법을 공유하려고 합니다! 현재 시간 구하기 LocalDateTime now = LocalDateTime.now(); 포맷을 하기 위해 LocalDateTime의 now() 메소드를 사용해서 현재 시간을 구해줍니다. 출력을 해보면 잘 출력되는 것을 확인할 수 있습니다. 요일 구하기 제가 사용한 포맷팅 형식은 ~월 ~일 (요일)입니다. now.format(DateTimeFormatter.ofPattern("MM월 dd일(E)")); 정..
SpringBoot로 JSON 응답 보내는 방법 (GSON JsonObject, @ResponseBody, @RestController) 안녕하세요! 이번에는 Spring Boot에서 JSON 형태로 return을 해주는 방법에 대해 알아보겠습니다. 정말 간단하기 때문에 쉽게 따라오실 수 있습니다! 💃 준비 - DTO 만들기 예시를 보여주기 위해 간단한 DTO를 만들어줍니다. @Setter @Getter public class Blog { private String title; private String content; } 👀 어노테이션 사용하기 컨트롤러 단에서 JSON 객체를 문자열로 간편하게 직렬화 할 수 있게 도와주는 두 어노테이션을 소개합니다. @RestController 데이터를 전송하기 위한 컨트롤러로 사용하며,@RestController를 사용하면 기본으로 하위에 있는 메소드들은 모두 @ResponseBody를 가지게 됩니다...
SpringBoot와 Thymeleaf를 이용하여 페이징하기 안녕하세요. SpringBoot로 만든 게시판 소스에 Thymeleaf를 사용하여 페이징 기능을 추가해보겠습니다. 목록을 가져오는 서비스 메소드 구현 먼저, 목록을 가져오는 서비스 메소드를 구현해보도록 하겠습니다. Service /** * 방명록을 모두 가져오는 메소드 * @param startAt 현재 가져온 페이지 * @return */ @Override public Page findAllPage(int startAt) { Pageable pageable = PageRequest.of(startAt, 10); return guestBookRepository.findAll(pageable); } startAt은 현재 페이지를 말합니다. 주소창에서 파라미터로 가져온 후 넘겨줍니다. (좀 이따 컨트롤러에서..
Spring Boot Map Struct Gradle 사용해보기 Map Struct? Map Struct란 자바 빈의 매핑(Entity - DAO)을 쉽게 하도록 도와주는 프래임워크 자세한 설명은 아래 링크를 참고해주세요! (공식 사이트) MapStruct - Java bean mappings, the easy way! MapStruct – Java bean mappings, the easy way! Java bean mappings, the easy way! Get started Download mapstruct.org Gradle 환경에서 Map Struct을 사용한 Spring Boot 예제 Map Struct를 사용하면서 삽질을 많이 했기 때문에, 다른 분들은 저 같은 삽질은 하지 않았으면 좋겠는 마음으로 예제를 만들었습니다! 예제를 작성하다보니 본의아니게 예..
Spring Boot Validation을 사용하여 요청 값 검증하기 전체 코드는 Github에서 확인이 가능합니다. Bean Validation 도메인 로직에서 값을 검증할 수 있게 도와주는 인터페이스이다. (참고:Java와 Spring의 Validaiton) 주요 어노테이션들은 아래와 같다. /** * 직접 검증을 하고 싶을 때 사용 */ @AssertTrue @AssertFalse /** * 문자열을 다룰 때 사용 */ @NotNull // null 불가능 @NotEmpty // null, 빈 문자열(스페이스 포함X) 불가 @NotBlank // null, 빈 문자열, 스페이스만 포함한 문자열 불가 @Size(min=?, max=?) // 최소 길이, 최대 길이 제한 @Null // null만 가능 ​ /** * 숫자를 다룰 때 사용 */ @Positive // 양수..
DAO, DTO 차이점 개발을 하다가 DAO, DTO의 개념이 헷갈려서 정리를 하게 되었다. DAO(Data Access Object)란? - 실제로 데이터베이스에 접근을 하기 위해 생성하는 객체 DTO(Data Transfer Object)란? - 데이터 교환을 위해 사용하는 객체 - DB의 데이터를 Controller 혹은 Service로 보낼 때 사용 - getter, setter를 가지고 있는다. - DTO vs VO - VO는 DTO와 비슷하지만, 수정할 수 없다. ( getter만 있는 것이라고 생각하면 됨)