728x90
π¨ Error :
@SpringBootTest
@Slf4j
public class PostgreDbTest {
@Autowired
PostgreRepository postgreRepository;
@Test
public void save() throws Exception {
// ν
μ€νΈ μΈμ€ν΄μ€ μμ±
Address address = new Address("μμΈμ", "κ°λ¨λλ‘", "12345");
Map<String, Object> additionalInfo = new HashMap<>();
additionalInfo.put("μ£ΌκΈ", 1000);
additionalInfo.put("ν", "PSG");
Member member = new Member( "μ΄κ°μΈ", 20, "010-1234-5678", "λ
μ", address, additionalInfo);
// Member μν°ν° μμ± λ° μ μ₯
Member savedMember = postgreRepository.save(member);
// κ²μ¦
Assertions.assertEquals(member, postgreRepository.findById(savedMember.getId()).orElse(null));
}
}
- postgreSQL λ°μ΄ν°λ² μ΄μ€ μ¬μ©μ μ΅νκΈ° μν΄ μλ° νλ‘μ νΈλ₯Ό μμ±νκ³ κ°λ¨νκ² ν μ€νΈλ₯Ό λ§λ€μλλ°
expected: <test.excelparser.postgre.entity.Member@79735611> but was: <test.excelparser.postgre.entity.Member@73476e2d>
Expected :test.excelparser.postgre.entity.Member@79735611
Actual :test.excelparser.postgre.entity.Member@73476e2d
- κ°μ²΄μ λ©λͺ¨λ¦¬ μ μ£Όμκ° μλ‘ λ€λ₯΄λ€κ³ λμλ€.
κ°λ¨ν μ 리νλ©΄
member κ°μ²΄λ₯Ό λ§λ€κ³
JPARepositoryμ save() λ©μλλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μ μ μ₯ν ν
κ³§μ₯ findByIdλ‘ λ°μ΄ν°λ² μ΄μ€μ ν΄λΉ κ°μ κΊΌλ΄μμ λ κ°μ²΄κ° λμΌν μ§λ₯Ό λΉκ΅νλ ν μ€νΈμ΄λ€.
λ¨μν μκ°ν΄μ κ°μ²΄λ₯Ό μ μ₯νκ³ κ·Έλλ‘ κΊΌλ΄μ λΉκ΅νλλ° μ μ°Έμ‘°νλ μ£Όμκ° λ€λ₯Έμ§ μ΄ν΄κ° κ°μ§ μμλ€.
π€ μμΈ :
λλ΄ ν΄κ·ΌκΉμ§ ν΄κ²°νμ§ λͺ»νκ³ μ€λλ§μ λΆνΈμΊ ν λκΈ°λ€κ³Ό λ§λ¬λ€. κ·Έλ κ² μ μ λ§μλ€κ° μλ¬ μκ°μ΄ λμ λκΈ°λ€μκ² μκΈ°νλλ° λ©μΈ νλ‘μ νΈ κ°μ΄ νλ νμ₯λμ΄ save() λ©μλκ° μλν ν νΈλμμ μ΄ λμ΄ λμ λ°μ΄ν°λ² μ΄μ€μμ κ°μ Έμ¨ κ°μ²΄μ μ£Όμκ°μ΄ λ¬λΌμ§ κ² μλλλ λ§μμ νμ ¨λ€. μ§μ μμ νλμ νΈλμμ μμ λμμν€κΈ° μν΄ @Transactional μ λν μ΄μ μ μ¬μ©νλ ν μ€νΈκ° ν΅κ³Όλμλ€. κ΄λ ¨ λ΄μ©μ GPTμ λ¬Όμ΄λ³΄κ³ μ»μ λ΅λ³μ μ λ¦¬ν΄ λ³΄μλ€.
- @Transactional μ λν μ΄μ μ μ¬μ©νλ©΄ νΈλμμ λ²μ λ΄μμ JPAκ° μμμ± μ»¨ν μ€νΈμ μ μ₯ν μν°ν°λ₯Ό κ΄λ¦¬νκ² λλ€.
- JPAμμ κ°μ μν°ν°λ₯Ό ꡬλΆνλ λ°©λ²μ μν°ν°μ @Id νλ κ°μ λΉκ΅νλ κ²μ΄λ€.
- κ·Έλ¬λ, μ΄ @Id κ°μ DBμμ μμ±λ κ°μ΄λ€.
- JPAκ° μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ μ μ₯ν λλ μ΄ κ°μ΄ μμ΄μ κ°μ²΄ μ£Όμ(μ°Έμ‘°κ°)λ₯Ό κΈ°μ€μΌλ‘ μν°ν°λ₯Ό ꡬλΆνλ€.
- @Transactional μ λν
μ΄μ
μ μ¬μ©νμ§ μμΌλ©΄ JPAκ° μμμ± μ»¨ν
μ€νΈμ μ μ₯ν μν°ν°λ ν΄λΉ νΈλμμ
λ²μλ₯Ό λ²μ΄λλ μκ° μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬λλ€.
- μ°Έκ³ λ‘, νΈλμμ μ΄ λλλ©΄ commit λκ³ flushκ° μλ νΈμΆλλλ° μ΄λ μμμ± μ»¨ν μ€νΈμ λΆλ¦¬λλ κ²μ΄μ§ λΉμμ§λ 건 μλλ€.
- μ΄ν findById() λ©μλλ₯Ό νΈμΆν λ μλ‘μ΄ νΈλμμ
μ΄ μμλμ΄ λ¦¬ν΄λλ κ°μ²΄λ μ£Όμκ°μ΄ λ¬λΌμ§κ² λλ€.
- μ΄μ νΈλμμ λ²μμμ μ μ₯ν μν°ν°κ° μμμ± μ»¨ν μ€νΈμμ κ΄λ¦¬λμλ€κ° μλ‘μ΄ νΈλμμ μμ findById() λ©μλλ₯Ό νΈμΆνλ©΄, μλ‘μ΄ νΈλμμ λ²μλ‘ μΈν΄ μλ‘μ΄ μμμ± μ»¨ν μ€νΈλ₯Ό μ¬μ©νκ² λλ€.
- μλ‘μ΄ νΈλμμ μ΄ μμλμ΄μ μλ‘μ΄ μμμ± μ»¨ν μ€νΈλ₯Ό μ¬μ©ν λλ μ΄μ μμμ± μ»¨ν μ€νΈμμ κ΄λ¦¬νλ μν°ν°μ μνλ₯Ό μ΄κΈ°ννλ€. λλ¬Έμ μ νΈλμμ μμλ findById() λ©μλλ₯Ό νΈμΆνλ©΄ μλ‘μ΄ μμμ± μ»¨ν μ€νΈμμ μ΄ μν°ν°μ μλ³μμ ν΄λΉνλ μν°ν°κ° μλ€κ³ νλ¨νκ³ λ°μ΄ν°λ² μ΄μ€μμ λ€μ μ‘°ννκ² λλ€.(findById()μ ν΄λΉνλ Select μΏΌλ¦¬κ° λκ°λ€.)
- λ°μ΄ν°λ² μ΄μ€μμ μ‘°νν μν°ν° κ°μ²΄λ μλ‘ μμ±λμ΄ μμμ± μ»¨ν μ€νΈμ μΆκ°λλ€.
- μ΄ λλ¬Έμ μ΄μ νΈλμμ μμ save()ν κ°μ²΄μ λ€λ₯Έ μ£Όμκ°μ κ°μ§κ² λλ κ²μ΄λ€.
- μ΄ μνμμ μν°ν°λ₯Ό λΉκ΅νλ κ°μ²΄ μ£Όμ(μ°Έμ‘°κ°)κ° μλ‘ λ€λ₯΄κΈ° λλ¬Έμ `assertEquals()` λ©μλκ° μ€ν¨νκ² λλ κ²μ΄λ€.
- λ°λλ‘ @Transactional μ λν μ΄μ μ μ¬μ©νλ©΄ JPAκ° νΈλμμ λ²μ λ΄μμ μν°ν°λ₯Ό κ΄λ¦¬νκΈ° λλ¬Έμ κ°μ μν°ν°λ₯Ό λΉκ΅ν λ κ°μ²΄μ μ£Όμκ°μ΄ λμΌνκ² λλ€.
- μ¦, κ°μ μν°ν°λ₯Ό λ€λ£° λ κ°μ²΄ μ£Όμκ° μΌμ νκ² μ μ§λκΈ° λλ¬Έμ `assertEquals()` λ©μλκ° μμν λλ‘ μλνκ² λλ κ²μ΄λ€.
- λμΌν νΈλμμ λ΄μμλ μμμ± μ»¨ν μ€νΈμμ κ°μ²΄λ₯Ό μ°ΎκΈ° λλ¬Έμ Select μΏΌλ¦¬κ° λκ°μ§ μλλ€.
π ν΄κ²° :
λ°©λ²μ λ κ°μ§κ° μλ€.
첫 λ²μ§Έ
@SpringBootTest
@Slf4j
@Transactional
public class PostgreDbTest {
...
}
- @Transactional μ λν μ΄μ μ λΆμ¬ ν μ€νΈ λ‘μ§ μ 체λ₯Ό νλμ νΈλμμ λ²μ μμΌλ‘ λμ΄ κ°μ μν°ν°λ₯Ό λΉκ΅ν λ λμΌν μ£Όμκ°μ΄ λλλ‘ νλ€.
λ λ²μ§Έ
- @EqualsAndHashCode μ λν μ΄μ μ Member ν΄λμ€μ λΆμΈλ€.
@EqualsAndHashCode
- Lombok(둬볡) λΌμ΄λΈλ¬λ¦¬μ μ΄λ Έν μ΄μ μ΄λ€.
- μ΄ μ΄λ Έν μ΄μ μ ν΄λμ€μ λΆμ΄λ©΄ λ‘¬λ³΅μ΄ μλμΌλ‘ ν΄λΉ ν΄λμ€μ λν equals()μ hashCode() λ©μλλ₯Ό ꡬννλ€.
- λ°λΌμ κ°μ²΄μ λμΌμ± λΉκ΅κ° λ΄λΆ μμ±κ°μ κΈ°λ°μΌλ‘ μνλλ€.
- μλ₯Ό λ€μ΄ μλμ κ°μ Member ν΄λμ€κ° μλ€κ³ κ°μ ν΄ λ³΄λ©΄
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Member {
private String name;
private int age;
// κΈ°ν λ©€λ² λ³μ λ±...
}
- μμ κ°μ΄ Member ν΄λμ€μ @EqualsAndHashCode μ΄λ Έν μ΄μ μ μ μΈνλ©΄
public class Member {
private String name;
private int age;
// κΈ°ν λ©€λ² λ³μ λ±...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Member member = (Member) o;
return age == member.age &&
Objects.equals(name, member.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
- μ»΄νμΌ μ μλμ κ°μ΄ equals()μ hashCode() λ©μλκ° μλμΌλ‘ μμ±λλ€.
- μ΄λ κ² λλ©΄ κ°μ²΄ κ° λΉκ΅ μ μ£Όμκ°μ΄ μλ λ΄λΆ μμ±κ°μ λΉκ΅νμ¬ λ κ°μ²΄μ λμΌμ±μ νλ¨νκ² λλ€.
- μ΄λ₯Ό ν΅ν΄ μμμ± μ»¨ν μ€νΈμμ κ°μ²΄λ₯Ό μ‘°νν λ λ°μνλ μ£Όμκ° μ°¨μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
π€ μλ¬Έμ :
μμ!
μ°Έκ³
λ€ΌνΌ
728x90