목록스프링 (9)
백엔드 개발자
스프링 부트에서 파일업로드 관련 rest api를 만들었는데 잘 동작하던게 갑자기 Current request is not a multipart request 이런 오류가 뜨며 동작하지 않았다. 스프링시큐리티 설정을 지워주니 잘 동작하여서 스프링시큐리티 관련해서 찾아보니 뭐 MultipartFilter를 추가해 주라고 했다. 근데 이것도 xml파일로 설정하는 글들이 대부분이어서 더 찾아보니 그냥 기존 @PATCHMAPPING 에서 @PUTMAPPING으로 바꿔주니 잘 동작하였다 ..!! 마찬가지로 @POSTMAPPING도 이거 대신 @PUTMAPPING을 써야하는 것 같다. 그럼 오류 해결 끝~~
Auditing 등록일, 수정일 같은 공통으로 필요한 속성들을 class 로 정의하여 추가할 수 있도록 해준다. 보통 createdDate 이나 updateDate을 추가해 줄 때 많이 사용한다. (등록자, 수정자도 가능) 기본 jpa에서는 @PrePersist 나 @PreUpdate를 사용해서 구현하는데 스프링 데이터 jpa는 클래스에 @EntityListeners(AuditingEntityListenner.class) 를 추가해주고 각 필드에 @CreateDate, @LastModifiedDate를 추가해 주면 된다. @EntityListeners(AuditingEntityListenner.class) @MappedSuperclass @Getter public class BaseEntity{ @Cre..
공통 인터페이스 CRUD에 해당하는 find, delete 등 많이 쓰이는데 항상 같은 코드를 반복하게 된다. JpaRepository 이것을 우리가 사용할 repository 인터페이스에서 JpaRepository 을 상속받으면 스프링 데이터 JPA에서 구현 클래스를 만들어 인터페이스를 구현한 프록시 객체를 만들어 준다. 우리는 인터페이스를 직접 구현하지 않고 find, findAll 등 지원하는 다양한 메서드를 사용할 수 있다. 메서드 쿼리 공통 인터페이스 말고 우리 도메인에 특화된 쿼리문도 필요할 것이다. 이때 정해진 규칙에 맞춰 메서드 이름을 작성하면 우리 도메인에 해당하는 쿼리로 구현체를 만들어준다. findByName 을 하면 name으로 찾아오는 쿼리를 자동 구현해 줄 것이다. And 로 여..
임베디드 타입 ( 값 타입 ) 식별자가 없다. 한 엔티티안에 종속되어 라이프 사이클도 종속된다. 엔티티가 삭제되면 함께 삭제된다. CasCadeType.ALL && 고아객체로 설정한 것과 같다. 식별자가 없으므로 추적도 불가능 하다. JPQL 객체지향 쿼리언어이다. SQL을 추상화한 언어이기 때문에 특정 데이터베이스에 종속되지 않는다. 문법은 sql 과 거의 유사하다. JPQL 문법 COALESCE : null 값인 경우 반환 값 지정 ⇒ coalesce(m.name, ‘이름 없는 회원’) NULLIF : 조건에 맞으면 null 반환 ⇒ NULLIF(m.name, ‘홍길동’) 이름이 홍길동이면 null 반환 CONCAT : 문자열 더하기 concat(’a’, ‘b’) SUBSTRING : 시작위치, 길이..
N + 1 문제 JPA를 이용하여 객체지향적인 설계가 가능해지는데, 엔티티 안에 엔티티를 포함할 경우 한 번 엔티티를 호출하는 것이 해당 엔티티에 포함된 다른 엔티티까지 호출하게 되면서 쿼리가 한 번 혹은 그 이상 더 호출하는 문제가 생기게 된다. JPQL을 사용할 때 발생하게 되는데(jpa에서 지원하는 find는 최적화를 통해 join으로 호출한다) JPQL을 SQL로 변환하여 호출하고 그 안에 필요한 값들을 추가로 호출하게 되는 것이다. 모든 값이 다 필요한 경우라면 모두 조회할 필요가 있지만 그게 아니라면 쓸데없는 호출이 생기는 것이다. 그래서 지연로딩인 FetchType.LAZY 설정을 통해 실제 조회하여 가져오는 것이 아닌 프록시 객체인 빈 껍데기를 넣어 만들어준다. 이것도 결국 모두 조회가 필..
객체와 테이블 매핑 @Entity 엔티티 선언 @Id : primary key 매핑, @GeneratedValue : 키 생성방법 지정, strategy 설정해줄 수 있다. 기본적으로 GenerationType.Auto 가 디폴트 값이다. GenerationType 의 종류 IDENTITY - auto increment 방식 (이 경우 jpa 영속성 컨텍스트에 들어갈 때 id 값이 있는 상태여야 하므로 커밋시점이 아닌 저장메서드를 호출할 때 바로 db로 저장이 된다. SEQUENCE - DB에 저장되어있는 마지막 키값을 불러와 그 다음 값으로 id 설정. (allocationSize를 설정하여 미리 사용할 키값들을 정해놓은 후 사용가능. 매번 db를 조회하지 않아도 됨) TABLE AUTO AUTO는 데..
기존 데이터 연동 방식 SQL 중심적인 개발 객체를 테이블에 맞춰 작성 ⇒ 객체지향을 따르기 위해 객체답게 설계할 경우 SQL과 매핑하는 과정에서 많은 join과 복잡한 쿼리가 생기게 된다. 그리고 이를 해결해 주는 것이 JPA 이다. JPA 란 ORM (Object relational mapping) 이다. → 객체 관계 매핑 JPA는 JAVA 애플리케이션과 JDBC 사이에서 동작한다. 기존방식처럼 SQL 과 매핑하기 위해 테이블에 맞추지 않고 객체는 객체대로 설계하고 JPA가 이를 변환하여 JDBC 에 넘겨준다. JPA 를 사용해야 하는 이유 객체적인 설계 가능 높은 생산성 유지보수 → 객체 중심으로 객체만 변경하면 됨 자유로운 객체 그래프 탐색 ( 기존: 모든 컬럼들을 모두 조인하여 사용하기에 어려..
우선 스프링 프로젝트를 생성하기 위해 https://start.spring.io/ 여기서 스프링 프로젝트를 생성해주었다. 버전은 3이상부터 자바 17이상을 사용해야 한다고 하여 2점대로 사용해주었다. group이름의 example을 원하는 것으로 변경하고, artifact 도 원하는 이름으로 변경해주면 된다. ex) group = com.jeju , artifact = sample 이런식으로 소속, 프로젝트 이름을 적어주면 된다. 자바버전은 11을 사용하였고 dependencies 는 일단 web, lombok, security, jpa를 넣어주었다. 그리고 generate를 눌러 생성해주면 압축파일이 다운된다. 압축을 해제하고 인텔리제이를 실행하여 오픈을 눌러준다. 다운받은 프로젝트를 클릭하여 buil..