JPA

· TIL ✍️
문제우리는 JPA 엔티티를 Ksuid라고 하는 고유 식별자를 사용하기로 했다. UUID 같은거다.  생성시간 기반의 20byte 고유 식별자로, 시간순으로 정렬이 가능해서 인덱싱의 이점을 누리면서도 랜덤값도 포함되어 중복 가능성이 거의 없으며, 길이도 짧다.  따라서 엔티티를 저장할 때 id를 넣어서 생성하도록 했다.  @Transactionalpublic S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (this.entityInformation.isNew(entity)) { this.entityManager.persist(entity); return entity; } else {..
· TIL ✍️
이번 프로젝트에서 DDD 개념을 일부 도입해 보면서 값객체를 시도해 볼 수 있는 부분에 적용을 해보았다. 인터넷에 유명한 Money나 Address는 당연히 구현해봤고, 아래는 그 외에 잘 구현했다고 생각되는 것을 적어봤다. @Getter@Embeddable@EqualsAndHashCode@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Rating { private static final int MIN_SCORE = 1; private static final int MAX_SCORE = 5; private Integer score; public Rating(int score) { if (!isScoreInR..
· TIL ✍️
나는 질문(Question) 1 : N 답변(Answer) 로 구성을 하고, 하나의 질문을 조회할 때는 그 질문에 대한 답변을 가져오기로 했다.근데 가져온 데이터가 중복이 된 것.{ "status": "OK", "code": 0, "message": "정상 처리 되었습니다", "data": [ { "id": 1, "content": "질문01", "views": 7, "createdAt": "2024-06-20T11:59:45", "modifiedAt": "2024-06-24T18:44:59.361887" }, { "id": 1,..
· TIL ✍️
HardDelete 와 SoftDelete 가 있다. HardDelete는 삭제 요청이 오면 DB에서 바로 삭제를 한다. SoftDelete는 삭제 요청이 오면 바로 삭제 처리를 하지 않고, 삭제 플래그를 표시해두어 DB에는 남겨둔다.  많은 SoftDelete 구현 방법이 있지만, 나는 datetime을 nullable로 두어 null이 아닌, 날짜가 기입되면 삭제처리를 한 것으로 두어 삭제 시간을 알 수 있도록 했다.  나중에 배치로 일주일의 간격을 두고 실제로 삭제할 예정이다.  @Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class)public abstract class BaseEntity { @Column(name = "..
· TIL ✍️
@Entity public class Account { @Id @GeneratedValue private Long id; private String name; private String street; private String city; private String state; private String zipCode; } 이렇게 Account 라는 객체가 있다고 할 때, street, city, state, zipCode는 서로 관련된 개념이다. 그리고 name 과는 관련이 없는 값들이다. JPA에서는 이를 하나로 묶어서 표현할 수 있다. @Embeddable public class Address { private String street; private String city; private String..
JPA에는 고아 객체 라는 게 있다. @Entity @Getter @Setter @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST) private List foodList = new ArrayList(); public void addFoodList(Food food) { this.foodList.add(food); food.setUser(this); } } @Entity @Getter @Setter @Tab..
· TIL ✍️
오늘 목표 숙련 주차를 페이징만 듣고 심화로 넘어갈랬는데 숙련을 들어야 심화를 들을 수 있어서 후딱 듣고 심화로 넘어갔다. 오늘 다 들어버리려고 했는데 노는 게 젤 좋아서,, 4시간 분량 중 1시간 반 남았다. 근데 50분어치는 아는 거라서 2배속으로 들을 듯. 낼 다 듣고 과제해야지. 캐스케이드란 ? 엔티티의 상태 변화를 전파시키는 옵션이다. @OneToMany 나 @ManyToOne에 줄 수 있는 옵션이다. @Entity @Getter @Setter @Table(name = "food") public class Food { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; privat..
· TIL ✍️
오늘 목표 숙련주차 완강 -> 다 못 들었고, 다 들을 필요 없을 것 같아서 페이징까지만 봤고, 낼부터 심화 강의로 넘어갈 예정 문제 이번에 뉴스피드 프로젝트를 할 때, 스프링 시큐리티로 인증 후 @AuthenticationPrincipal로 가져온 UserDetails 안에 있는 User 엔티티를 이용해서, 패스워드를 변경하는 API를 만들고 있었다. 근데 update 쿼리가 안 나간다!! 이게 뭐여 하면서 일단은 서비스단에서 User의 nickname을 이용해서 다시 레포지토리에서 가져오는 식으로 해결을 했었다. 오늘 마침 여유도 있겠다 그 부분을 해결해 봤다. 아, 이게 트러블 슈팅이네 일단 에러가 났던 코드는 밑과 같다. @PatchMapping("/api/users/password") publi..
yunjae62
'JPA' 태그의 글 목록