Web

    [Java] File to MultipartFile (import 포함)

    다크모드로 보시는걸 추천드립니다. 스프링에서 파일업로드를 구현할때 테스트 코드를 작성하려면 File을 읽어와서 MultiPartFile로 변환해주어야 합니다. 변환하는 코드는 인터넷에 많지만 어떤것을 import하는지 아무리 찾아봐도 나오지 않아서 제가 직접 찾아가며 구현했습니다. File 을 MultiparFile로 변환하는 코드를 사용하기 위해서는 2가지가 만족되어야 합니다. (gradle(혹은 maven) fileupload, io) dependency 추가 제대로된 (FileItem, DiskFileItem, IOUtils) import gradle dependency 추가하기 맨 아래 두개를 꼭 추가해주어야 합니다. 그래야 import가 잘 동작합니다. dependencies { implemen..

    warning: CRLF will be replaced by LF in gradlew.bat. 문제해결방법

    git add . 시 warning: CRLF will be replaced by LF in gradlew.bat. 문제가 발생한다. 이것은 git에서 발생하는 Whitespace 에러이다. 유닉스시스템에서는 한줄의 끝이 LF 로 이루어지지만, 윈도우에서는 CR,LF (CRLF)로 이루어지기 때문에 git에서 어느것을 선택할지 혼란이 온 것이다. 해답은 core.autocrlf를 켜주어서 git이 자동으로 한 줄의 끝을 변환해주는 기능을 사용하면 왼다. 윈도우 사용자는 git config --global core.autocrlf true 리눅스, 맥 사용자는 git config --global core.autocrlf true input 명령어를 입력하면 된다. 물론 global 설정이 아닌 이 프로젝트..

    인텔리제이에서 커맨드라인으로 쓰던 git 중간에 연동하기 + merge conflict gui로 해결하기

    인텔리제이에서 원래는 CLI로 git을 사용했는데, merge conflict 를 해결할때는 gui를 이용하는 것이 생산성이 좋을 것 같았다. 그래서 중간에 인텔리제이에서 git을 연결하는 방법을 찾아보았다. 처음에 깃을 연동하지 않았을 때는 VCS에서 git 버튼이 보이지 않는다. 인텔리제이에서 .git을 자동으로 읽어오지 않는 것이다. 하지만 수동으로 기존에 쓰던 .git을 읽어오게 하는 방법이 있다. Enable Version Control Integeration을 누르면 기존에 쓰던 .git을 가져오고 위와같이 intellJ에서도 git을 이용할 수 있게된다. 그리고 merge conflict가 발생했을 때는 아래와 같이 Resolve Conflicts가 활성화 된다. 클릭을 하면 merge co..

    [JPA, Lombok] @Setter 없애기 대안

    목차 (클릭시 해당 목차로 이동) 1. 생성자를 통해 주입한다. package study.datajpa.entity; import lombok.Getter; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @Getter public class Member { @Id @GeneratedValue private Long id; private String username; protected Member() { } public Member(String username) { this.username = username; } } 1) 빈 생성자를 하나 추가해야한다. ..

    [h2 database] 데이터베이스 생성하기

    맨 처음에 데이터베이스가 생성되지 않았을 때는 위와같이 오류가 뜬다. 그러면 아래와 같이 jdbc:h2:~/{원하는 데이터베이스 이름} 으로 한번 connect 하면 데이터베이스 파일이 생성된다. 그리고 이후부터는 jdbc:h2:tcp://localhost/~/{데이터 베이스 명} 으로 접근하면 된다.

    EP5. OSIV와 성능 최적화

    OSIV (Open Session In View) 풀네임 하이버네이트 에서는 Open Session In View JPA에서는 Open EntityManager In View 이다. 뜻 OSIV가 off 이면 트랜잭션을 종료할때 영속성 컨텍스트 닫히면서 데이터 커넥션도 반환한다. 그런데 OSIV가 on이면 트랜잭션이 끝난 이후에도 영속성 컨텍스트가 살아있고 데이터 커넥션 풀이 계속 존재한다. 그래서 지연로딩과 같은 전략을 사용할 수 있다. 장단점 OSIV on 장점 : 지연로딩을 사용할 수 있다. 단점 : 데이터커넥션 풀이 유지되는 리소스가 크다. OSIV off 장점 : 데이터 커넥션 풀을 원하는 시간만 사용하기 때문에 자원의 낭비가 없다. 단점 : 지연로딩을 사용할 수 있고 사용하려면 트랜잭션이 끝나..

    EP4. API 개발 순서

    한눈에 정리 엔티티 조회 엔티티는 그대로 반환하지 말고 DTO로 변환해서 반환해라 컬렉션은 패치조인 하지말고 지연로딩을 유지후 BatchSize로 최적화해라 DTO 직접 조회 컬렉션은 IN 절을 이용해 메모리에 미리 조회해서 최적화해라 API 개발 순서 1. 엔티티 조회 방식으로 먼저 접근하기 1) 페치 조인으로 쿼리 수를 최적화한다. 2) 컬렉션을 최적화해라 1. 페이징이 필요하면 hibernate.default_batch_fetch_size 혹은 @BatchSize로 최적화해라 2. 페이징이 필요 없다면 페치조인을 사용해라 2. 엔티티 조회 방식으로 해결이 안되면 DTO 조회 방식을 사용해라 1) 컬렉션은 IN 절을 이용해 메모리에 미리 조회해서 최적화해라 3. DTO 조회 방식으로도 해결이 안되면 ..

    EP3. 컬렉션 조회 최적화 - 2 (JPA에서 DTO 직접조회)

    2021.04.06 - [Web/JPA] - EP2. 지연 로딩과 조회 성능 최적화 2021.04.07 - [Web/JPA] - EP3. 컬렉션 조회 최적화 - 1 EP3. 컬렉션 조회 최적화 - 1 주문내역에서 주문한 상품정보까지 추가로 조회 해보자. EP2 에서는 @XToOne 을 조회하는 기능을 최적화 했었다. 2021.04.06 - [Web/JPA] - EP2. 지연 로딩과 조회 성능 최적화 여기서는 @XToMany인 컬렉션을 ksabs.tistory.com 앞에서는 엔티티를 DTO로 변환해서 컬렉션으로 반환했다. 이번에는 DTO를 그대로 반환해서 JPA가 DTO를 직접 조회하게 만들어 보겠다. JPA에 DTO를 직접 반환 하는것의 장단점은 이미 정리를 해봤었다. 장점 쿼리가 한번만 나간다. 원하..

    EP3. 컬렉션 조회 최적화 - 1

    주문내역에서 주문한 상품정보까지 추가로 조회 해보자. EP2 에서는 @XToOne 을 조회하는 기능을 최적화 했었다. 2021.04.06 - [Web/JPA] - EP2. 지연 로딩과 조회 성능 최적화 여기서는 @XToMany인 컬렉션을 조회하는 기능을 구현하고 최적화 해보자. Order 엔티티에서 컬렉션인 OrderItem과 OrderItem의 Item이 필요하다. Item도 Order 기준으로는 컬렉션이다. Order package jpabook.jpashop.domain; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence..

    EP2. 지연 로딩과 조회 성능 최적화

    주문을 조회하는 API를 설계해보았다. package jpabook.jpashop.api; import jpabook.jpashop.domain.Order; import jpabook.jpashop.repository.OrderRepository; import jpabook.jpashop.repository.OrderSearch; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * XToOne (ManyToOne, One..