Over-fetching vs Under-fetching 알아보기 1. Over fetching Over-fetching은 클라이언트가 필요로 하지 않는 정보를 서버에서 받아오는 것을 의미합니다. 예를 들어, 클라이언트가 사용자 이름만 필요한데, 서버에서는 사용자 정보의 모든 필드를 반환하는 경우입니다. 이 경우, 클라이언트는 필요하지 않은 데이터를 받아와서 불필요한 데이터 전송량이 증가하게 되고, 서버 부하가 증가합니다. 2. Under fetching Under-fetching은 클라이언트가 필요로 하는 정보를 얻기 위해 여러 번의 요청을 보내야 하는 것을 의미합니다. 예를 들어, 사용자 정보를 조회하는 API가 있다고 가정해봅시다. 이 API에서는 사용자 정보와 함께 해당 사용자의 게시글 목록도 반..
[Spring] default_batch_fetch_size의 작동원리 알아보기 Spring에서 default_batch_fetch_size는 Hibernate의 설정 중 하나로, 지연 로딩을 사용하는 엔티티에서 일괄 조회할 때 fetch size를 설정하는 옵션입니다. 설정 값은 정수 형태로 지정되며, 한 번의 쿼리로 가져올 엔티티 수를 결정합니다. 예를 들어, default_batch_fetch_size를 20으로 설정하면, 쿼리 한 번으로 20개의 엔티티를 가져올 수 있습니다. 이렇게 일괄 조회를 하면 데이터베이스와의 통신 횟수가 감소하게 되어 성능 향상을 기대할 수 있습니다. 문제점 default_batch_fetch_size를 지나치게 크게 설정하면 네트워크 및 메모리 문제가 발생할 수 있습니다..
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는 클라이언트와 서버 간의 데이터 교환을 위한 목적으로 사용되며, ..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.