본문 바로가기

(48)
JPA findBy~In 쿼리 findByIdIn(List ids)이런식으로 입력받은 ids 리스트에 해당하는 spot들을 찾아야 했다. 이때 ids는 각 이미지 별로 어떤 포토스팟에 해당하는지를 나타내는 용도이기에 중복된 id 값들이 들어갈 확률이 아주 높다.예를 들어 1,1,3,2,4,2,.... 하지만 In절은 비교 연산자 (=) 와 논리 연산자 (OR) 을 결합한 연산자로, 인자 리스트 (ids)에 중복된 값이 들어오면 자동으로 중복값을 제거를 해버린다.예를 들어 1,1,3,2,4,2 이렇게 들어왔다면 1,3,2,4만 남는 것이다. findByIdIn(1L,1L,3L,2L,4L,2L)findByIdIn(1L,3L,2L,4L)따라서 이렇게 중복 제거된 조건이 사용된다! 더불어 중복제거 뿐만 아니라 순서보장도 하지 못한다. 따라서..
@RequestBody vs @ModelAttribute vs @RequestPart vs @RequestParam RequestBody는 Http 요청 header의 Content-type을 보고 어떤 Converter를 사용할지 정하기 때문에 Content-type을 반드시 명시해주어야 한다. Content-type의 종류application/json: {key : value} 형태로 전송application/x-www-form-urlencoded: key=value&key=value 형태로 전송multipart/form-data: 파일 업로드시 사용되며 '파일을 비롯한 여러 데이터가 있음'이라는 뜻을 가진다. (@RequestBody로 받을 수 없다) @RequestBody vs @ModelAttribute vs @RequestPart vs @RequestParam@RequestBody : application/..
이미지 업로드 비동기 처리 1. AsyncConfig 우선 AsyncConfig 클래스부터 만들어주어야 한다.이는 Spring에서 비동기 작업을 설정하기 위한 설정 클래스로, @Async 메서드를 어떻게 실행할지 설정하는 것이 AsyncConfig의 역할이다.  주로 비동기 작업을 위한 스레드 풀을 설정하고 관리하는데 사용된다.  Thread Pool 의 작동방식 1) 초기에 Core Pool Size만큼 스레드가 생성되고, 작업들이 이 스레드에서 처리된다. 2) CorePoolSize만큼의 스레드가 모두 작업중이면, 새로 들어온 작업은 Work Queue에 대기하게 된다. 3) Work Queue는 스레드가 비게 되면 대기 중인 작업을 꺼내서 처리한다. 4) 만약 Work Queue가 가득 찼다면, Thread Pool은 추가적..
S3에 이미지 업로드 & 삭제 https://innovation123.tistory.com/198 [AWS/S3] Spring boot project 이미지 업로드를 위해 S3 버켓 만들기Amazon S3 버킷 만들기 IAM 만들기 생성 완료 IAM accessKey, secretKey 얻기 IAM - 사용자 - 보안 자격 증명 액세스 키 만들기 CLI 선택 accessKey, secretKey 저장 저 두 가지 Key를 저장해 뒀다가 spring properties에 등innovation123.tistory.com 1. S3 버킷 만들기 -> 웹 사이트의 이미지를 사용자가 볼 수 있게 하려면 버킷의 퍼블릭 엑세스를 허용해주고+ 파일 업로드 시 퍼블릭 ACL을 설정해주어야하는데 얘는 개발하는 코드에서 설정해주면 됨!  2. IAM 사..
cascade type 속성 + N+1문제 해결법 결론 cascade=CascadeType.ALL 속성@Transactional public void createPost(PostRequestDto postRequestDto,Long userId){ //User 객체 가져오기 User user=userRepository.findById(userId).orElseThrow(()-> new IllegalArgumentException("해당 id의 유저가 존재하지 않습니다.")); //post 엔티티 생성, 저장 Post newPost=postRequestDto.toPost(user); //postRepository.save(newPost); (불필요) ..
Base Entity 구현 Base Entity 사용created_at과 updated_at 속성은 여러 엔티티에서 공통적으로 사용되므로, 이를 BaseTimeEntity로 분리하고, 해당 속성이 필요한 엔티티들은 BaseTimeEntity를 상속받아 사용하도록 구현하였다.BaseTimeEntity@Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class) // 엔티티의 수정/생성등의 이벤트가 발생하였을 때, 이와 같은 변경사항을 Audit하기 위함public class BaseTimeEntity { @CreatedDate @Column(name="created_at", updatable = false, columnDefinition = "timestam..
JPA 관련 문제들 (주로 N+1문제) Q1. 어떻게 data jpa는 interface만으로도 함수가 구현이 되는가?Spring Data JPA는 애플리케이션 실행 시, JpaRepository 인터페이스를 상속하는 repository 인터페이스에 대해 프록시 패턴을 사용해 SimpleJpaRepository 기반의 구현체를 동적으로 생성하고, 이를 빈으로 등록해 의존성을 주입해주기 때문이다.SimpleJpaRepository@Repository@Transactional(readOnly = true)public class SimpleJpaRepository implements JpaRepositoryImplementation { ... @Transactional @Override public S save(S entity) { ..
스프링 빈 Spring BeanSpring Bean이란Bean : 스프링 컨테이너에 의해 인스턴스화되고, 조립되고, 관리되는 객체Spring Bean : 스프링 컨테이너에 등록된 객체. 주로 @Bean, @Component, @Service 같은 어노테이션을 붙여 특정 객체를 빈으로 등록한다.Spring Bean의 Life Cycle스프링 컨테이너 생성 → Bean의 생성 → 의존성 주입 → 초기화 콜백 → Bean의 사용 → 소멸 전 콜백 → 스프링 종료초기화 콜백 : 애플리케이션 서버가 시작될때 DB 와 연결설정하는 등 외부 자원과의 연결을 설정소멸 전 콜백 : 서버 종료 시 DB연결 미리 끊는 종료 작업빈 생명주기 콜백 관리 방법은 3가지인터페이스 (InitializaingBean, DisposableBean..