본문 바로가기
반응형

분류 전체보기96

[JPA] @EnableJpaAuditing 활용하기 데이터를 생성하거나 수정할 때, 누가, 언제 해당 작업을 했는지 알기 위해 보통 아래와 같은 필드를 공통으로 각 테이블에 포함 시켜 테이블을 설계한다. createdAt (생성일자) modifiedAt (수정일자) createdBy (생성자) modifiedBy (수정자) 생성 일자와 생성자는 테이블에 신규 레코드(row)가 생길 때마다 입력되어야 하고 수정 일자와 수정자는 특정 row 가 업데이트될 때마다 반영되어야 한다. 그냥 구현한다면? 가장 간단한 방법으로는 생성자 또는 setter 메소드를 활용하여 직접 값을 설정하면 된다. @Table(name = members) @Entity public class Member { ... @Column private Datetime createdAt; @Co.. 2023. 2. 3.
[JPA] @OrderBy 두 개의 Entity 가 @OneToMany, @ManyToOne 어노테이션을 활용하여 1:N 관계로 맵핑이 되어 있는 경우에 JPA 로 부모 Entity 를 조회하게 되면 자식 Entity 들도 알아서 조회가 된다. 매번 부모 Entity 기준으로만 조회를 했었어서 함께 조회되는 자식 Entity 에 대해서는 크게 신경을 쓰지 않았었다. 그런데 조회한 자식 Entity 를 최신순으로 정렬해야 하는 필요성이 생겨서 고민을 하다가 @OrderBy 라는 어노테이션으로 해결한 케이스를 적어본다. 생각보다 간단했다. 문제 상황 1:N 관계의 두 개의 Entity 가 존재한다. 부모 Entity 는 Product 이고, 자식 Entity 는 ProductHistory 이다. @Entity public class .. 2023. 2. 3.
[스프링] 프로그래밍 방식의 트랜잭션 관리 방법 [스프링] @Transactional 에서는 트랜잭션과 스프링에서의 @Transactional 어노테이션에 대해 알아보았는데, 프로그래밍 방식의 트랜잭션도 함께 소개를 했었다. 이번에는 프로그래밍 방식의 트랜잭션에 집중해서 정리를 해보고자 한다. Programmatic Transaction 트랜잭션을 관리하기 위해 흔히 사용하는 @Transactional 어노테이션을 활용하지 않고, 코드 내에서 개발자가 직접 트랜잭션 범위를 설정하며 관리하는 방식을 의미한다. 의견이 다양하겠지만 개인적으로는 개발자에게 트랜잭션 범위를 직접 설정할 수 있도록 하여 자율성을 추구하고 @Transactional 어노테이션으로는 구현하기 어려운 (예: 동일 클래스 내 여러 메소드 간 호출에서 트랜잭션을 각각 적용하고 싶은 경우.. 2023. 2. 3.
[스프링] 스프링의 역사 자바 또는 코틀린 기반의 웹 어플리케이션 프레임워크인 Spring (스프링) 은 어떻게 탄생되었을까? 한번 알아보자. 2000년대 초반.. 스프링 프레임워크가 탄생하기 이전 2000년대 초반에는 EJB (Enterprise Java Bean) 이라는 자바 진영의 표준 기술을 활용해 웹 어플리케이션을 개발했다. EJB 는 트랜잭션, 분산기술, ORM 등 많은 기술을 지원하였고 여러 기업(특히 금융권)에서 많이 사용했다고 한다. 한국에서도 꽤나 사용을 했던 모양이고, 스프링이 막 생겨날 무렵에도 튼튼한 입지를 보여줬나보다. 스프링의 탄생 EJB 를 대신하기 위해 개발자들은 좀 더 사용하기 쉽고 EJB 의 단점을 개선한 오픈소스를 개발하기 시작했고, SI 개발자 Rod Johnson (로드 존슨) 이 2002.. 2023. 2. 2.
[디자인패턴] 실무에서 사용해본 전략 패턴 (Strategy Pattern) 신입 개발자일 때 배워서 여태 잘 써먹고 있는 디자인 패턴인 "전략 패턴 (Strategy Pattern)"을 소개해보려고 한다. 전략패턴이란? 하나의 행동에 대해 수행 가능한 여러 전략을 만들고 자바의 다형성을 통해 전략을 선택해서 실행하는 디자인 패턴 예시 소개 커머스 사이트에서는 많은 상품들이 존재하고, 그 상품들은 특정 기준에 따라 점수가 메겨지고 높은 순서가 상품 목록 상단에 위치하게 된다. 상품에 대한 점수화를 구현하기 위해 아래와 같은 요구사항이 들어왔다고 가정해보자. 1. 각 상품의 최종 점수는 다양한 기준에 따라 계산된 점수를 모두 합하여 계산한다. 2. 점수를 계산하는 알고리즘은 변동될 수 있으며 새로운 알고리즘이 추가, 기존 알고리즘이 삭제될 수 있다. 3. 상품의 유형에 따라 특정 .. 2023. 2. 2.
[프로그래밍] 검색과 조회에 대한 Naming Convention 들어가며 어떤 프로젝트의 백엔드 개발을 하게 되면 CRUD API 는 무조건적으로 개발하게 됩니다. 데이터 생성, 조회, 업데이트, 삭제는 기본 기능입니다. 데이터 조회 API CRUD 에서 R (Read) 에 해당하는 데이터 조회는 크게 2가지 기능이 있습니다. 1) PK 기반으로 작동하는 데이터 조회 예: userId 100 에 해당하는 데이터 조회 2) 페이징이 필요한 데이터 검색 예: userName 에 "김" 이 포함되어 있고, age 가 20세 이상인 user 모두 검색 (1페이지, 페이지당 10개) 네이밍 컨벤션 위와 같은 데이터 조회 API 를 개발할 때, 메소드의 이름은 주로 어떻게 설정하시나요? 보통 findBy..., getBy..., fetchBy..., searchBy... 등 다.. 2023. 2. 2.
[스프링] 트랜잭션과 스프링의 @Transactional 스프링에서 데이터베이스와 관련된 처리를 하는 작업을 진행하다 보면 @Transactional 어노테이션을 사용하게 된다. 한번 알아보도록 하자. 트랜잭션(transaction)이란? "Transaction" 는 사전적 의미로 "거래", "매매", "처리(과정)" 이라는 의미를 가지고 있다 (네이버 사전). 일반적인 "거래"를 생각해보면 내가 무언가를 얻기 위해서는 무언갈 주어야 한다. 예를 들어, 사과 하나를 사기 위해서는 일정 금액의 돈을 지불해야 한다. 돈은 지불하지 않은 상태에서 사과만 획득하고 거래를 마칠 수는 없다. A 가 돈을 지불하고, B 는 그 돈을 받고 A 에게 사과를 건내 준다 까지 성공적으로 완료되어야 "거래"가 성사된다. 데이터베이스에서도 트랜잭션은 데이터베이스와 관련된 하나의 논리.. 2023. 2. 2.
[스프링] @NotEmpty, @NotBlank, @NotNull 비교하기 API 를 작성하다보면 요청을 받는 DTO 에 대한 유효성 검증을 해야한다. 값이 없어도 되는 필드가 있는 반면, 값이 꼭 필요한 필드가 있다. nullable 에 대한 유효성 검증은 다양한 방법으로 할 수 있는데, Controller 레벨에서 조건문을 활용할 수도 있고 Objects 또는 Collections 의 유틸 함수를 활용할 수도 있다. @NotEmpty, @NotBlank, @NotNull 라는 표준 Validation 을 활용할 수도 있는데, 유사하지만 다른 역할을 하는 3개의 Validation 에 대해 정리해보고자 한다. Bean Validation Bean Validation 자파 기술 표준으로 유효성 검증 어노테이션과 인터페이스의 모음이다. 이 인터페이스 모음을 구현하여 우리가 자주 .. 2023. 2. 2.
반응형