e.toString(), e.getMessage(), e.printStackTrace() 예외처리 알아보기 1. e.toString() e.toString() 메서드는 예외 객체의 문자열 표현을 반환합니다. 이 메서드는 예외를 간단하게 출력하고자 할 때 사용할 수 있습니다. try { // 예외 발생 가능한 코드 } catch (Exception e) { System.out.println(e.toString()); } 2. e.getMessage() e.getMessage() 메서드는 예외 객체의 메시지를 반환합니다. 이 메서드는 예외 메시지만 출력하고자 할 때 사용할 수 있습니다. 다음은 예시입니다. try { // 예외 발생 가능한 코드 } catch (Exception e) { System.out...
[Spring] ModelMapper를 이용해 DTO와 Entity 변환 방법 알아보기 ModelMapper는 Java 객체 간에 데이터를 매핑하는 라이브러리입니다. 이를 이용해 DTO와 Entity 간의 데이터 변환을 쉽게 할 수 있습니다. 다음은 ModelMapper를 이용해 DTO와 Entity 간의 데이터 변환을 하는 방법입니다. 1. ModelMapper 의존성 추가 dependencies { implementation 'org.modelmapper:modelmapper:2.4.4' } 2. ModelMapper Bean 등록 Spring Boot를 사용하는 경우, ModelMapper를 Bean으로 등록해주어야 합니다. @Configuration public class AppConfig { @..
Spring @Cacheable을 내부 메서드에 쓰면 안되는 이유 알아보기 Spring의 @Cacheable 어노테이션은 메서드의 실행 결과를 캐싱하는 기능을 제공합니다. 이를 통해 같은 요청에 대한 처리 시간을 줄일 수 있으며, 캐시를 이용해 응답 속도를 향상시킬 수 있습니다. 그러나 @Cacheable을 내부 메서드에 사용하는 것은 권장되지 않습니다. 이유는 다음과 같습니다. 1. @Cacheable은 public 메서드에만 적용 가능합니다. 2. 메서드 안에서 @Cacheable을 사용하면, 메서드 호출 시 캐시 검색 로직이 추가되어, 메서드 호출 비용이 높아집니다. 3. 내부 메서드에서는 일반적으로 외부에서 호출되지 않아, 캐시할 필요가 없습니다. 또한, 내부 메서드를 캐시하면, 외부 메서드가 변..
[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..