[Spring] 캐시(Cache) 추상화와 사용법 알아보기(@Cacheable, @CachePut, @CacheEvict) 1. Gradle 설정 dependencies { // ... implementation 'org.springframework.boot:spring-boot-starter-cache' } 2. 캐시 설정 스프링에서 캐시를 사용하기 위해서는 캐시를 적용할 대상 메소드에 @Cacheable, @CachePut, @CacheEvict 등의 어노테이션을 적용해야 합니다. @Cacheable(value = "cacheName", key = "#key") public Object findData(String key) { // ... } @CachePut(value = "cacheName", k..
[Spring] Entity에 protected 생성자를 만드는 이유(@Noargsconstructor) 기본 생성자의 접근제어를 Protected로 설정해놓게 되면 무분별한 객체 생성에 대해 한번 더 체크할 수 있기 때문입니다. 예시) @Getter @Setter @NoArgsConstructor public class User{ private Long id; private String name; private Long age; private String email; } public static void main(String[] args){ User user = new User(); user.setName("이름1"); user.setEmail("이메일1"); } 위 User 클래스와 main 함수를 ..
[Spring] @RequestBody가 빈 생성자가 필요한 이유 알아보기 @RequestBody로 매핑할 객체는 HTTP 요청의 Body 데이터가 자바 객체로 변환될 때, 해당 객체의 빈 생성자가 호출되어 객체를 생성해야 합니다. 이는 Spring에서 Jackson 라이브러리를 이용하여 JSON 데이터를 객체로 변환하는 과정에서 발생하는데, Jackson 라이브러리는 객체를 생성할 때 기본 생성자(default constructor)를 호출하기 때문입니다. 그리고 Spring에서는 @RequestBody를 이용하여 요청의 Body를 자바 객체로 매핑할 때 Jackson 라이브러리를 사용합니다. 따라서 @RequestBody로 매핑할 객체는 빈 생성자가 있어야 Jackson 라이브러리가 객체를 생성할 수..
스프링 LocalDateTime.now() 테스트 방법 1. 인스턴스 생성 LocalDateTime.now()를 사용하는 메서드를 포함하는 클래스의 인스턴스를 생성합니다. 2. 가짜 객체 생성 LocalDateTime.now() 메서드를 호출하는 코드를 실행하기 전에, 현재 시간을 고정할 수 있는 Clock 객체를 생성합니다. 이때, Mockito.mock() 메서드를 이용하여 Clock 인터페이스를 가짜 객체로 생성합니다. 3. When메서드를 사용하여 시간정보 반환 설정 when() 메서드를 사용하여 Clock 인터페이스의 instant() 메서드 호출 시, 고정된 시간 정보를 반환하도록 설정합니다. 4. Clock 객체 사용 테스트 코드에서 LocalDateTime.now()를 호출하면, 고정된 시..
Entity vs DTO vs VO 비교 알아보기 Entity : 비즈니스 로직을 포함하는 도메인 객체 DTO (Data Transfer Object) : 데이터 전송을 위한 객체 VO (Value Object) : 값(Value)을 나타내는 객체 Entity는 데이터베이스와 매핑되는 도메인 객체로, 비즈니스 로직을 포함합니다. 즉, 데이터베이스의 테이블과 1:1로 매핑되며, 영속성(Persistence)을 가지고 있습니다. 이러한 Entity는 주로 서비스 계층(Service)에서 사용됩니다. DTO는 계층 간 데이터 전송을 위한 객체로, Entity의 일부 데이터나 여러 개의 Entity에서 가져온 데이터를 조합하여 생성됩니다. DTO는 클라이언트와 서버 간의 데이터 교환을 위한 목적으로 사용되며, ..
[Spring] JPA 생성, 변경 일시 자동생성 및 format 변경 알아보기 자동생성 방법 1. JPA 이벤트를 사용하여 자동 생성 @EntityListeners(AuditingEntityListener.class) @Entity public class Member { ... @CreatedDate private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime modifiedDate; ... } 위와 같이 @CreatedDate와 @LastModifiedDate 어노테이션을 사용하여 엔티티 저장 및 수정 시각을 처리하도록 설정하면, createdDate와 modifiedDate 필드에 자동으로 값이 채워지게 됩니다. 2. JPA ..
[Spring] 스프링 @Transactional 작동 안할때 원인 및 해결방법 알아보기 1. Spring AOP 설정이 되어 있지 않은 경우 @Transactional 애노테이션을 사용하기 위해서는 Spring AOP 설정이 되어 있어야 합니다. 해결방법 - @EnableAspectJAutoProxy 어노테이션을 설정 파일이나 설정 클래스에 추가해야 합니다. 2. Transaction Manager 설정이 되어 있지 않은 경우 트랜잭션을 관리하기 위해서는 Transaction Manager가 설정되어 있어야 합니다. 해결방법 - 사용하는 데이터베이스에 맞는 Transaction Manager를 설정 파일이나 설정 클래스에 추가해야 합니다. 3. 메소드가 Public이 아닌 경우 Spring AOP는 P..
[Spring] Logging Framework 와 Logback 알아보기 Spring Logging Framework Spring Logging Framework는 Spring 프레임워크에서 제공하는 로깅 추상화 인터페이스입니다. 특정한 로깅 구현체에 종속되지 않고 일관된 방식으로 로깅을 수행할 수 있습니다. Spring Logging Framework는 SLF4J(Simple Logging Facade for Java) 인터페이스를 지원합니다. SLF4J는 Java 언어에서 사용되는 로깅 인터페이스 중 하나로, 로깅 구현체와의 결합도를 낮추어줍니다. 따라서 어플리케이션에서 로깅을 수행할 때 SLF4J를 사용하면, 어떤 로깅 구현체를 사용하더라도 일관된 방식으로 로깅을 수행할 수 있습니다. Logbac..
[Spring] Entity를 Dto로 변환 하는 방법 알아보기 MapStruct란? MapStruct는 자바 언어로 작성된 객체 매핑 라이브러리입니다. 이를 사용하면 DTO(Data Transfer Object)와 Entity(Entity Class) 객체간의 변환을 쉽게 할수 있습니다. MapStruct의 가장 큰 장점은 컴파일 시점에서 코드를 생성하여 속도가 빠르다. 1. 의존성 추가 plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation 'org.mapstruct:mapstruct:1.4.2.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1..
@Request Body에서 Setter가 필요없는 이유 알아보기 @RequestBody 어노테이션은 HTTP 요청 메시지의 본문(body) 데이터를 자바 객체로 변환하는 기능을 합니다. 이 때, 자바 객체의 생성자와 Getter/Setter 메서드를 이용하여 객체를 생성하고, 값을 설정합니다. 따라서 @RequestBody 어노테이션을 사용하여 요청 메시지의 본문 데이터를 자바 객체로 변환할 때, 해당 객체에 대한 Setter 메서드가 필요합니다. Setter 메서드를 이용하여 요청 메시지에서 전달된 데이터를 객체에 설정할 수 있습니다. 하지만, @RequestBody 어노테이션을 사용하여 객체를 생성할 때, Setter 메서드를 사용하지 않고 생성자를 이용하여 객체를 생성할 수도 있습니다. 이 경우에..