(금요일까지)
-JPARepository
replyJPARepository.deleteById(id);
//해당 id(pk)에 해당하는 고객 정보를 지워죠. 그리고 그 기능을 가지고 있는있는 class 가 replyJPARepository!.
em.flush();
내 생각 🎵) jpa는 기본 crud 기능 구현하기 위해 사용. 그리까 그냥 repository는 쿼리를 사용하여 다 적었어야 하는데 jparepository는 기본 메서드들을 갖고 올 수 있어서 더 간편해져서 사용한
아직x
이거는 아직와닿지x~-v
그니까 db에 바로 정보를 수정할 수 있어서? db에 바로 연결해서 이걸 쓴다?
그 말은. flush는 바로 정보를 흘려보내는 거니까
여기서도 정보를 바로 db에 흘려보낼 수 있는 것?-v
PA에서 em.flush()의 역할
em.flush()는 JPA에서 매우 중요한 역할을 합니다. 이 메소드는 영속성 컨텍스트의 변경 내용을 데이터베이스에 즉시 반영하도록 합니다. 특히, deleteById(id)와 같이 엔티티를 삭제하는 작업 후에 em.flush()를 호출하면, 해당 변경 사항이 데이터베이스에 바로 반영되어, 같은 트랜잭션 내에서 변경된 데이터를 사용할 수 있게 됩니다. 🔄
em.flush()의 기본 개념
영속성 컨텍스트 동기화: em.flush()는 영속성 컨텍스트의 상태를 데이터베이스와 동기화합니다. 이는 영속성 컨텍스트에 쌓인 쿼리(INSERT, UPDATE, DELETE 등)를 데이터베이스에 반영하는 과정입니다. 1
트랜잭션 내 반영: 트랜잭션을 커밋하기 전에 em.flush()를 사용하면, 해당 트랜잭션 내에서 변경된 데이터를 사용할 수 있습니다. 이는 테스트나 특정 비즈니스 로직에서 유용하게 사용될 수 있습니다.
deleteById()와 em.flush()의 관계
데이터베이스와의 동기화: deleteById()로 엔티티를 삭제한 후 em.flush()를 호출하면, 삭제된 엔티티에 대한 변경 사항이 즉시 데이터베이스에 반영됩니다. 이는 데이터 일관성을 유지하는 데 중요합니다. 2
캐시와 데이터베이스의 일관성: JPA의 1차 캐시와 데이터베이스 사이의 일관성을 유지하기 위해 em.flush()가 사용됩니다. 삭제 연산 같은 경우, 캐시와 데이터베이스 사이에 불일치가 발생할 수 있는데, em.flush()를 통해 이를 해결할 수 있습니다.
em.flush()는 JPA를 사용하면서 데이터의 일관성을 유지하고, 트랜잭션 내에서 변경된 데이터를 즉시 반영할 필요가 있을 때 매우 유용한 메소드입니다. 데이터베이스와의 동기화를 보장하며, 영속성 컨텍스트와 데이터베이스 사이의 일관성을 유지하는 데 중요한 역할을 합니다.
JPA를 사용하여 데이터를 삭제하고, 그 결과를 확인하는 과정을 조금 더 쉽게 설명해 드리겠습니다. 데이터 삭제하기: deleteById 메소드를 사용해서 데이터를 삭제합니다. 이 메소드는 데이터베이스에서 해당 ID를 가진 데이터를 찾아서 삭제합니다. 삭제 확인하기: 삭제가 잘 되었는지 확인하기 위해서는, 같은 ID로 데이터를 다시 찾아보면 됩니다. 만약 데이터가 삭제되었다면, 더 이상 그 데이터를 찾을 수 없을 것입니다. 여기에 해당하는 간단한 코드 예시입니다:
이 코드는 먼저 deleteById를 사용하여 ID에 해당하는 데이터를 삭제합니다. 그 후, 같은 ID로 findById를 사용하여 데이터를 조회합니다. 만약 데이터가 성공적으로 삭제되었다면, findById는 비어 있는 Optional을 반환할 것입니다. 이를 확인함으로써 데이터가 정말로 삭제되었는지를 간단히 검증할 수 있습니다. 즉, 삭제 후에 다시 조회를 했을 때 아무것도 나오지 않으면 (즉, Optional이 비어 있으면), 그것은 삭제가 성공적으로 이루어졌음을 의미합니다.
Optional 클래스란?~-v
Null 문제 해결: 자바에서는 변수가 가리키는 값이 없을 때, 즉 null일 때 문제가 발생할 수 있어요.
이를 NullPointerException (NPE)라고 하는데,
이 문제를 해결하기 위해 자바 8부터 Optional 클래스를 사용할 수 있게 됐어요.
Optional의 기능
값의 존재 여부 확인: Optional은 값이 있을 수도 있고, 없을 수도 있는 상황을 표현해요.
값이 있으면 그 값을 사용하고, 없으면 다른 동작을 하도록 할 수 있어요.
이렇게 함으로써 프로그램이 더 안정적으로 동작하게 도와줘요.
메소드 제공: Optional 클래스는 값이 있는지 없는지 확인하는 메소드(isPresent(), isEmpty())와
값이 있을 때만 어떤 동작을 실행하는 메소드(ifPresent()) 등 다양한 메소드를 제공해요.
이 메소드들을 사용하면 복잡한 조건문 없이도 값의 존재 여부를 쉽게 다룰 수 있어요.
JpaRepository JpaRepository는 JPA에 특화된 기능을 제공하는 인터페이스입니다. PagingAndSortingRepository와 QueryByExampleExecutor를 상속받아 페이징, 정렬 및 샘플 기반 쿼리 실행과 같은 추가 기능을 제공합니다. JpaRepository는 JPA의 EntityManager를 사용하여 데이터를 관리하므로, JPA에 특화된 메소드들(예: flush(), saveAndFlush(), deleteInBatch())을 제공합니다. ~-v
🎁 아직 잘 모르겟음
@Test
public void delete_test() {
// given
int id = 1; // 삭제하고 싶은 데이터의 ID
// when
replyJPARepository.deleteById(id); // 데이터 삭제
// then
Optional<Reply> result = replyJPARepository.findById(id); // 삭제된 데이터 조회 시도
assertFalse(result.isPresent()); // 데이터가 삭제되었다면, 결과는 'false'가 되어야 합니다.
}
1) 개념 정리
-JPARepository
-em.flush
-optional
-finadAll
-단위테스트??
-stackoverflow 뭐냐
-assertion, assertthat
-junit 테스트
[[ given/when/then 패턴 ] // 실전연습이 필요
요즘 단위테스트는 거의 given-when-then 패턴으로 작성하는 추세이다.
given-when-then 패턴이란 1개의 단위 테스트를 3가지 단계로 나누어 처리하는 패턴으로,
각각의 단계는 다음을 의미한다.
given(준비): 어떠한 데이터가 준비되었을 때
when(실행): 어떠한 함수를 실행하면
then(검증): 어떠한 결과가 나와야 한다.]
jnit
유닛 테스트~-v
프로그래밍에서 모든 함수와 메서드에 대한 테스트 케이스(Test case)를 작성하여
의도된 대로 잘 동작하는지 검증하는 절차
프로그램을 작은 단위로 쪼개어 각 단위가 정확하게 동작하는지 검사함으로써
프로그램의 안정성을 높임
System.out.println()으로 하는 번거로운 디버깅이 필요없으며,
개발기간 중 대부분을 차지하는 디버깅 시간을 단축
🔧 JUnit
자바 프로그래밍 언어용 유닛 테스트 프레임워크
테스트 결과는 Test클래스로 개발자에게 테스트 방법 및 클래스의 History를 공유 가능
단정(assert) 메서드로 테스트 케이스의 수행 결과를 판별 ~-v
어노테이션으로 간결하게 지원(JUnit4부터)
s 정리>> junit이란 코드 테스트 할 수 있는 것.
[ given/when/then 패턴 ]
요즘 단위테스트는 거의 given-when-then 패턴으로 작성하는 추세이다. given-when-then 패턴이란 1개의 단위 테스트를 3가지 단계로 나누어 처리하는 패턴으로, 각각의 단계는 다음을 의미한다.
given(준비): 어떠한 데이터가 준비되었을 때
when(실행): 어떠한 함수를 실행하면
then(검증): 어떠한 결과가 나와야 한다.
출처: https://mangkyu.tistory.com/144 [MangKyu's Diary:티스토리]
junit이 테스트 해보는 건 알겠는데 핵심로직, 테스트 하고 싶은 걸 연습하는 건 알겠는데 언제 정확히 쓰이는 건지는 약간 부족(코드, 실전이 부)- v
🎁 단정메서드 ~-v
단정 메서드 [더보기 Link]
assertArrayEquals(a, b)
: 배열 A와 B가 일치함을 확인
assertEquals(a, b)
: 객체 A와 B가 같은 값을 가지는지 확인
assertEquals(a, b, c)
: 객체 A와 B가 값이 일치함을 확인( a: 예상값, b:결과값, c: 오차범위)
assertSame(a, b)
: 객체 A와 B가 같은 객체임을 확인
assertTrue(a)
: 조건 A가 참인지 확인
assertNotNull(a)
: 객체 A가 null이 아님을 확인
findAll (Reply) [JUnit / 단위 테스트]-V
@Test
public void findAll_test() {
// given
// when
List<Reply> replies = replyJPARepository.findAll();
// findAll 을 사용 후 값을 List에 담아준다.
System.out.println("findAll_test/size : " + replies.size());
// replies 사이즈 확인 (더미 데이터로도 확인이 가능하다)
// then
Assertions.assertThat(replies.size()).isEqualTo(3);
// JUnit 테스트
}
💎💍💎stackoverflow _ 이게 왜 뜨는지 오류로 🎁
List<Reply> replies = replyJPARepository. findAll();
System.out.println("findAll_test/size : " + replies.size());
🎁 replies.size 여기서 replies를 한 이유는? 이게 왜 stackover flow가 뜨는 지 공부💎💍💎 이거는 무슨 소리인지 모르겠다.
💎💍💎코드 해석 해오삼
Assertions.assertThat(replies.size()).isEqualTo(3);
🎁 replies에서 원하는 사이즈(정보갯수)를 asserthat에 넣어서 확인하고 그것이 3과 일치한다면 assertions에 넣어진다??
Assertions.assertThat(replies.size()).isEqualTo(3);
//Assertions.assertThat들은 해당 조건의 것들만 정렬하여 주는 것?
-여기선 3 줄의 코드를 assertions에 넣는 것.??



참고
postman
뷰가 없거나 값을 넣고 확인하고 싶을 때 사용함.

jvm이 너무 바빠 새 스택(-기술?)을 넣을 시간이 없어요?! ~v
+) 해당코드를 찾아봐야 함-v
Share article