π 2024λ 01μ 24μΌ
- Author
@Entity @Getter @Builder @Builder(toBuilder = true) @AllArgsConstructor @NoArgsConstructor public class Author { /* authorλ₯Ό μ΄κΈ°ν ν λ post κ°μ²΄κ° νμν μμ μμΈ mappedByμ μ°κ΄κ΄κ³μ μ£ΌμΈμ λͺ μνκ³ , fkλ₯Ό κ΄λ¦¬νλ λ³μλͺ μ λͺ μ */ @OneToMany(mappedBy = "author", cascade = CascadeType.ALL) private List<Post> posts; }
- Post
@Entity @Getter @Builder @NoArgsConstructor @AllArgsConstructor public class Post { /* post κ°μ²΄ μ μ₯μμλ ν μ¬λμ΄ μ¬λ¬ κΈμ μμ±ν μ μλ€. @JoinColumn(nullable = false, name = "autor_email", referencedColumnName = "email") author_idλ DBμ 컬λΌλͺ , λ³λ€λ₯Έ μ΅μ μμ μ authorμ pkμ fk μ€μ */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "author_id") private Author author; }
λ°©λ² μμ μ½λ @JsonIgnore μ¬μ© ν΄λΉ μ΄λ Έν μ΄μ μ μ¬μ©νλ©΄ μν°ν° κ°μ μν μ°Έμ‘°λ₯Ό 무μνκ³ μ§λ ¬νν λ ν΄λΉ νλλ₯Ό μ μΈν μ μμ΅λλ€. μ£Όλ‘ μλ°©ν₯ κ΄κ³μμ μ¬μ©λ©λλ€. @JsonManagedReference, @JsonBackReference μ¬μ© `@JsonManagedReference`λ μ§λ ¬νν λ μ°Έμ‘°λ κ°μ²΄λ₯Ό μ§λ ¬ννλλ‘ ν©λλ€. `@JsonBackReference`λ μλ°©ν₯ μ°Έμ‘°λ₯Ό μ§λ ¬ννμ§ μλλ‘ ν©λλ€. μλ°©ν₯ κ΄κ³μμ μ£Όλ‘ μ¬μ©λ©λλ€. DTO μ¬μ© μν°ν° λμ λ°μ΄ν° μ μ‘ κ°μ²΄(DTO)λ₯Ό μ¬μ©νμ¬ νμν μ λ³΄λ§ μ λ¬ν μ μμ΅λλ€. DTOλ₯Ό ν΅ν΄ μν μ°Έμ‘°λ₯Ό νΌνκ³ νμν λ°μ΄ν°λ§ μ μ‘ν μ μμ΅λλ€. Cascade, Fetch Type μ‘°μ λΆλͺ¨ μν°ν°λ₯Ό μμ ν λ CascadeType.REMOVE λλ CascadeType.ALLμ΄ μ€μ λ μμ μν°ν°λ ν¨κ» μμ , μ°κ΄ κ΄κ³μ Fetch Typeμ μ‘°μ νμ¬ μ§μ° λ‘λ©(Lazy Loading)μ μ¬μ©νλ©΄ μν μ°Έμ‘°λ₯Ό νΌν μ μμ΅λλ€. νμν μμ μλ§ λ°μ΄ν°λ₯Ό λ‘λ©ν©λλ€. μν μ°Έμ‘°κ° νμν κ²½μ° ν΄κ²° μ λ΅ μ ν μΌλΆ μν©μμλ μν μ°Έμ‘°κ° νμν κ²½μ°λ μμ΅λλ€. μ΄λλ νΉμ ν ν΄κ²° μ λ΅μ μ ννμ¬ λ¬Έμ λ₯Ό μ΅μννκ³ μμ μ μΌλ‘ λμνλλ‘ ν©λλ€.
- AuthorRepository
@Repository public interface AuthorRepository extends JpaRepository<Author,Long> { // findBy 컬λΌλͺ μ κ·μΉμΌλ‘ μλμΌλ‘ where쑰건문μ μ¬μ©ν λ©μλ μμ± Optional<Author> findByEmail(String email); }
- PostRepository
@Repository public interface PostRepository extends JpaRepository<Post,Long> { List<Post> findByAuthor_Id(long author_id); List<Post> findAllByOrderByCreatedTimeDesc(); }
- Query Method
ν€μλ μμ μ€λͺ findBy findByFirstName(String firstName) `firstName` μμ±μ κΈ°λ°μΌλ‘ λ μ½λλ₯Ό κ²μν©λλ€. findUserBy findUserByFirstNameAndLastName(...) μ¬λ¬ μμ±μ μ‘°ν©νμ¬ λ μ½λλ₯Ό κ²μν©λλ€. findBy...And... findByFirstNameAndAge(String name, int age) μ¬λ¬ μμ±μ μ‘°ν©νμ¬ λ μ½λλ₯Ό κ²μν©λλ€. findAll findAll() λͺ¨λ λ μ½λλ₯Ό κ°μ Έμ΅λλ€. deleteBy deleteByLastName(String lastName) `lastName` μμ±μ κΈ°λ°μΌλ‘ λ μ½λλ₯Ό μμ ν©λλ€. removeBy removeByLastName(String lastName) `deleteBy`μ λμΌν μν μ ν©λλ€. countBy countByLastName(String lastName) `lastName` μμ±μ κΈ°λ°μΌλ‘ λ μ½λ μλ₯Ό μΈλ λ©μλμ λλ€. distinctBy findDistinctByLastName(String lastName) `lastName`μ κΈ°λ°μΌλ‘ μ€λ³΅ μ κ±°λ λ μ½λλ₯Ό κ²μν©λλ€. findAllBy findAllByLastNameOrderByFirstNameAsc(...) `lastName`μ κΈ°μ€μΌλ‘ `firstName`μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νμ¬ λͺ¨λ λ μ½λλ₯Ό κ²μν©λλ€. findBy...Between findByAgeBetween(int min, int max) `age`κ° νΉμ λ²μ λ΄μ μλ λ μ½λλ₯Ό κ²μν©λλ€. findBy...IsNotNull findByLastNameIsNotNull() `lastName`μ΄ nullμ΄ μλ λ μ½λλ₯Ό κ²μν©λλ€. findBy...IsNull findByLastNameIsNull() `lastName`μ΄ nullμΈ λ μ½λλ₯Ό κ²μν©λλ€. findBy...OrderBy...Desc findByLastNameOrderByAgeDesc(...) `lastName`μ κΈ°μ€μΌλ‘ `age`λ₯Ό λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬νμ¬ λ μ½λλ₯Ό κ²μν©λλ€. findBy...GroupBy... findByLastNameGroupByAge(...) `lastName`μ κΈ°μ€μΌλ‘ `age`λ₯Ό κ·Έλ£Ήνν λ μ½λλ₯Ό κ²μν©λλ€. findBy...Having... findByLastNameHavingCountByAge(...) `lastName`μ κΈ°μ€μΌλ‘ `age`μ κ°μκ° νΉμ 쑰건μ λ§μ‘±νλ λ μ½λλ₯Ό κ²μν©λλ€. findBy...Like findByFirstNameLike(String pattern) `Like` μ°μ°μλ₯Ό μ¬μ©νμ¬ `firstName`μ΄ νΉμ ν¨ν΄κ³Ό μΌμΉνλ λ μ½λλ₯Ό κ²μν©λλ€. findBy...StartingWith findByLastNameStartingWith(String prefix) `lastName`μ΄ νΉμ μ λμ¬λ‘ μμνλ λ μ½λλ₯Ό κ²μν©λλ€. findBy...EndingWith findByLastNameEndingWith(String suffix) `lastName`μ΄ νΉμ μ λ―Έμ¬λ‘ λλλ λ μ½λλ₯Ό κ²μν©λλ€. findBy...Containing findByLastNameContaining(String sequence) `lastName`μ΄ νΉμ λ¬Έμμ΄μ ν¬ν¨νλ λ μ½λλ₯Ό κ²μν©λλ€.
public void update(long id, PostCreateDto postCreateDto ) throws EntityNotFoundException { Post post = this.findById(id); post.postUpdate(postCreateDto.getTitle(), postCreateDto.getContents()); postRepository.save(post); // postRepository.save(post); μμ΄λ μ μ₯λ };
μμμ± μ»¨ν μ€νΈμμ μν°ν°μ μν λ³νλ₯Ό κ°μ§νκ³ , μ΄λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μλμΌλ‘ λ°μνλ λ©μ»€λμ¦
1. νΈλμμ μμ: μν°ν°μ μν λ³κ²½μ νΈλμμ λ΄μμ μ΄λ£¨μ΄μ§λλ€. νΈλμμ μ΄ μμλλ©΄ μμμ± μ»¨ν μ€νΈκ° μν°ν°μ μ€λ μ·(μ΄κΈ° μν)μ μ μ₯ν©λλ€. 2. μν°ν° μν λ³κ²½: νΈλμμ λ΄μμ μν°ν°μ μμ±μ΄ λ³κ²½λλ©΄, μμμ± μ»¨ν μ€νΈλ μ΄ λ³κ²½ μ¬νμ μΆμ ν©λλ€. 3. νΈλμμ 컀λ°: νΈλμμ μ΄ μ»€λ°λ λ, μμμ± μ»¨ν μ€νΈλ μν°ν°μ νμ¬ μνμ μ€λ μ·μ λΉκ΅νμ¬ λ³κ²½λ λΆλΆμ κ°μ§ν©λλ€. 4. λ°μ΄ν°λ² μ΄μ€ μ λ°μ΄νΈ: λ³κ²½λ λΆλΆμ΄ κ°μ§λλ©΄, JPAλ ν΄λΉ μν°ν°μ λν UPDATE 쿼리λ₯Ό μμ±νμ¬ λ°μ΄ν°λ² μ΄μ€μ λ°μν©λλ€.