오래전 만들어두었던 사이드 프로젝트를 리팩토링하는 작업을 진행중에 소소하게 막힌 부분들 중 간단히 작성할 수 있는 내용을 남긴다. 현재 리팩토링하는 프로젝트는 SpringBoot 3.2.3 버전에 JPA 관련해서는 `spring-boot-starter-data-jpa` 라이브러리를 사용한다. 기본적으로 모든 레파지토리는 `JpaRepository` 인터페이스를 상속하는 형태로 존재한다.문제가 된 부분은 게시글(BoardImp)을 조회할 때, 대소문자 구분없이 들어온 값이 포함되는 데이터를 조회하는 기능을 작성하는 것이었다. `LOWER()`와 `LIKE %문자열%`를 함께 쓰고 싶었다. 실행되길 원하는 쿼리문은 아래와 같았다.SELECT b.* from board_imp bWHERE (LOWER(b.ti..
Backend/JPA
앞서, JPA를 이용해 데이터를 조회해와 클라이언트로 반환하는 API를 작성할 때에는 반환 타입으로 엔티티를 그대로 사용하면 안된다. 엔티티를 바로 반환할 때의 문제점은 아래 더보기를 참고하자.더보기엔티티를 직접 반환할 때의 단점 1. 엔티티를 직접 노출하게 될 경우 엔티티가 수정되면 API 스펙이 변경되어 버린다. 예를 들어 name 필드를 username으로 변경하게 되면, API를 호출해 Response를 받는 클라이언트측 입장에서는 갑자기 name 데이터를 제대로 가져오지 못하는 경우가 발생한다.2. 엔티티는 다양한 스펙의 API에 대응할 수 있어야 한다. 하나의 API에 의존하는 엔티티는 다른 API 스펙에 유연하게 대처할 수 없다.3. 프레젠테이션 계층을 위한 로직이 엔티티에 추가된다. 엔티티..
JPA는 DB 데이터와 Java Entity를 맵핑해주는 역할을 한다. 이 때, 영속성 컨텍스트(Persistence Context)를 중심으로 엔티티를 맵핑하고 관리한다. 따라서 영속성 컨텍스트라는 개념 없이는 JPA를 이해하기 어렵다. 영속성 컨텍스트(Persistence Context) 영속성(Persistence)의 사전적 의미는 ‘영원히 계속되는 성질이나 능력’이다. 데이터의 상태를 영구히 지속되게 하는 방법은 DB에 저장하는 방식을 떠올리기 쉽다. 하지만, 이 영속성 컨텍스트가 데이터를 관리한다는 말이 실제로 데이터를 DB에 저장하는 것은 아니다. 영속성 컨텍스트는 일종의 논리적인 영역이다. 한번 DB에서 조회해온 데이터는 영속성 컨텍스트에서 관리하며 이를 ‘영속 상태’에 있다고 한다. JPA..
클래스 Member의 구조 @Table(name = "member") @Entity @Setter @Getter @ToString(exclude = "certKey") @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "title", nullable = false) private String title; @Column(name = "content", nullable = false) private String content..
JPA는 Java 진영의 ORM 기술 표준으로, 애플리케이션과 JDBC API 사이에서 동작합니다. 💡 ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑시켜줍니다. 객체와 관계형 데이터베이스의 테이블을 매핑해서 두 패러다임간의 불일치 문제를 개발자 대신 해결해줍니다. JPA와 Hibernate의 차이 JPA는 Java ORM 기술에 대한 API 표준 명세입니다. 즉, 인터페이스들을 모아둔 것이므로 JPA를 사용하기 위해서는 JPA를 구현한 ORM 프레임워크를 사용해야 합니다. 이에는 Hibernate, EclipseLink, DataNucleus 가 있는데, Hibernate가 가장 대중적으로 사용됩니다. Hibernate는 자바 진영에서 가장 많이 사용되는 OR..