Spring/Spring 문법 22

JPA 레벨 vs 데이터베이스 레벨 (feat.성능)

JPA는 엔터티를 객체로 다룬다는 장점이 있지만 일부 작업에서 데이터베이스와 직접 상호작용하는 방식에 비해 성능이 떨어질 수 있습니다. 그 이유는 JPA가 데이터베이스 작업을 처리할 때 엔터티 매핑과 관리라는 추가 작업을 수행하기 때문입니다. 주요 차이점JPA 레벨엔터티를 메모리로 가져온 뒤, 각 엔터티에 대해 작업을 수행합니다.데이터베이스와의 작업이 세부적으로 나뉘어질 수 있으며, 네트워크와 메모리 사용량이 증가합니다.특징: 개별적인 SELECT, UPDATE, DELETE 쿼리가 여러 번 실행됩니다.데이터베이스 레벨조건에 따라 데이터베이스가 직접 데이터를 조회하거나 삭제하는 작업을 수행합니다.작업이 데이터베이스 내에서 한 번에 처리되므로 성능이 최적화됩니다.특징: 단일 쿼리로 작업을 수행합니다.   ..

ArgumentResolver - HandlerMethodArgumentResolver 란 무엇일까?

HandlerMethodArgumentResolver :Strategy interface for resolving method parameters into argument values in the context of a given request.  메소드 매개변수를 확인하고, 이를 HTTP 요청을 바탕으로 인수 값 (argument value) 으로 변환하는 역할을 합니다. 즉 어떻게 '메서드 파라미터'를 적합한 '인수 값'으로 변환할지"를 결정하는 인터페이스입니다. 우리는 구현체를 만들어 사용하면 되겠습니다.  메서드 매개변수와 인수값이 무엇을 의미하는 걸까요 ?@GetMapping("/profile")public ResponseEntity getProfile(VerifiedMember verified..

@Scheduler 사용해보기(주기 마다 메서드 실행)

SpringBoot 에서 @Scheduler 에노테이션을 사용하면 주기마다 특정 메서드를 호출할 수 있습니다.    1. @EnableScheduling 에노테이션 추가하기@EnableScheduling@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 보통 @SpringBootApplication이 포함된 클래스에 추가합니다.   2. Bean 으로 등록된 클래스의 메서드에 @Scheduled 추가하기@Scheduled(fixedDelay = 1000L)public void sche..

Pageable 과 PagedModel

Pageable: Spring Data JPA 에서 제공하는 인터페이스로 페이징 및 정렬 정보를 전달하는데 사용됩니다. Pageable 객체는 @RequestParam을 자동으로 매핑해줍니다.  주요 특징페이지 번호(page): 0부터 시작하는 현재 페이지 번호페이지 크기(size): 한 페이지에 포함될 항목의 수정렬 기준(sort): 특정 컬럼을 기준으로 오름차순 또는 내림차순으로 정렬 일반적으로 @PagaableDefault 또는 클라이언트에서 전달된 page, size, sort 파라미터를 통해 Pageable 객체가 생성됩니다. @GetMapping("/trades")public ResponseEntity> getTrades( @PageableDefault(size = 10, sort = "..

Mock 을 이용한 테스트 코드 - argument matcher

Long seatNum = 1L;// 이건 오류 발생when(lockService.acquireLock(seatNum, anyLong()))    // 이건 정상 작동when(lockService.acquireLock(eq(seatNum), anyLong()))    Mockito의 argument matcher와 일반 인자를 혼용하면 InvalidUseOfMatchersException 발생합니다.모든 인자에 매처를 사용하거나 모든 인자를 일반 값으로 사용해야 합니다. // 모든 인자를 matcher로 처리하는 경우when(lockService.acquireLock(any(), anyLong()))  matcher 사용 규칙:한 메서드 호출에서 matcher 사용 시, 모든 인자에 matcher 적용 ..

AWS S3 버킷 사용하기

MultipartFile 방식1. S3Config   S3 클라이언트를 설정하기 위한 클래스입니다. Amazon S3에 연결하려면 인증 정보와 지역 설정이 필요합니다.accessKey, secretKey, region 정보를 담고 있는  AmazonS3Client를 Bean으로 등록합니다. @Configurationpublic class S3Config { @Value("${cloud.aws.credentials.accessKey}") private String accessKey; @Value("${cloud.aws.credentials.secretKey}") private String secretKey; @Value("${cloud.aws.region.static}") private Stri..

Transaction Propagation

Transaction Propagation은 한 트랜잭션이 동작하고 있을 때, 다른 트랜잭션이 동작하는 경우 어떻게 전파될지를 결정하는 속성입니다. Spring Framework에서 @Transaction 애노테이션을 사용하여 트랜잭션을 선언할 때 설정할 수 있으며, 트랜잭션 경계 설정과 실행 컨텍스트 관리를 유연하게 합니다.   Transaction Propagation의 주요 사용 시점복잡한 비즈니스 로직 분리:하나의 서비스 계층에서 여러 하위 서비스 계층을 호출할 때 각 계층의 트랜잭션 범위를 다르게 설정해야 하는 경우.재사용성 향상:공통 메서드를 다른 서비스에서 재사용하지만, 트랜잭션 전파 방식을 상황에 따라 다르게 적용해야 할 때.롤백 처리 제어:특정 하위 작업은 상위 트랜잭션과 독립적으로 처리..

QueryDsl - Projections 의 4가지 방식

QueryDsl - Projections QueryDsl 을 사용해서 엔티티 전체를 조회하는 것이 아니라 특정 대상만 조회하는 것을 말합니다.  @Entity@Table(name = "team")@Getter@NoArgsConstructorpublic class Team extends Timestamped { @Id private Long id; private String name; private Integer trophyCount;}@Entity@Table(name = "member")@Getter@NoArgsConstructorpublic class Member extends Timestamped { @Id private Long id; private String..

Spring Security 적용

스프링 시큐리티를 적용하면서 크게 6개의 클래스를 사용했습니다. WebSecurityConfigUserDetailsImplUserDetailsServiceImplJwtUtilJwtAuthenticationFilterJwtAuthorizationFilter 코드를 올리고, 해당 클래스가 어떤 역할을 맡았는지 이야기해보겠습니다. 코드를 읽으며 아래 설명을 차례대로 보시면 이해하기 편하실 겁니다.  - WebSecurityConfig@Configuration@EnableWebSecurity@RequiredArgsConstructorpublic class WebSecurityConfig { private final JwtUtil jwtUtil; private final UserDetailsServic..