TIL - 0619

스프링 프로젝트 - java-ims

Mockito를 통한 Service 단위테스트와 도메인 단위테스트

  • 다른 의미의 테스트임 : 같아보이지만 Service 계층을 테스트 하는 것과 도메인에 대한 단독 테스트는 다름
    • 서버 자원을 사용하는 것과 일반 자바 객체를 테스트 하는 것에서 차이

삭제 기능

  • 바로 삭제를 하지않고, 삭제 상태로 만들어놓음 : 삭제 상태로 변경된 엔티티를 또다른 엔티티(히스토리)로 만들어서 보관함
    • 일정 기간이 지났을 때 엔티티를 실제로 삭제함
    • 기록 또한 일정기간 보관
@Entity
public class DeleteHistory {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private long id;
    
    @Enumerated(STRING)
    private ContentType contentType;
    
    private long contentId;  
    
    @ManyToOne
    @JoinColumn(foreignKey = @ForeignKey(name = "fk_deletehistory_to_user"))
    private User deletedBy;
    
    private LocalDateTime deleteTime;
}

서버사이드 랜더링 할 때 결과에 따라 분기 처리를 할 때

  • Result 객체를 사용함 : 서버사이드랜더링 해야하기때문에, 서비스 단에서 처리 이후 컨트롤러에 결과를 넘겨줄 때 Result를 넘겨줌
    • Result에 따라 컨트롤러가 처리를 하는데, Result에는 ok() / fail()에 따라서 가지고 있는 데이터가 다름

jvm memory

jvm 런타임 데이터 영역

  • 운영체제로부터 할당받은 메모리를 가지고 데이터를 저장하는 영역 : 메모리 영역을 분할해서 저장하고 관리
    • 자체적으로 메모리 관리 : 프로그램 안에서 프로그램을 실행시키는 것이 jvm(java virtual machine)
    • 효율을 위해 GC(Garvage Collector)가 활동함 : 사용되지않는 힙 영역의 메모리를 회수함(스택과 연결되지않은 힙 자원)

런타임 데이터 영역 분할 관리

  • 총 6개의 영역이 나뉘어짐 : 최우선적으로 알아야할 영역 - 메소드(class, static) / 힙 / 스택 영역
  • 핵심 3가지 영역
    • 메소드 : jvm 시작 시 생성되는 영역, 클래스와 인터페이스의 런타임 상수풀(static, 필드 메소드의 참조 주소 값이 저장), 메소드 선언(정보)과 실행 바이트코드 정보가 담기며, 쓰레드 간 공유하는 영역(간략히 정의하면 클래스, 인터페이스의 정보가 담김)
    • 힙 : 객체(인스턴스)가 저장되는 공간이며, 쓰레드 간에 공유되는 영역임(공유 객체 조심), GC의 메모리 회수 대상
    • 스택 : 스택 프레임(메소드의 실행에 필요한 정보 - 지역변수 배열과 피연산자 스택)을 저장하는 구조체(스택), 메소드 실행 시 스택 프레임이 생성되어서 push되고, 메소드 실행이 종료되면 스택프레임이 스택에서 pop 됨, 쓰레드마다 할당되는 영역

JPA - 엔티티, 엔티티 매니져, 엔티티 매니져 팩토리, 커넥션풀, 커넥션, 영속성 컨텍스트

  • 엔티티 : 데이터베이스의 레코드라고 생각하면 됨, 데이터의 단위(1개), 엔티티를 Object화 하기위해서 클래스를 만듬(엔티티 클래스)
    • 생명주기 : 준영속(메모리에만 존재) - 영속(영속성 컨텍스트에 저장, 관리, 데이터베이스 싱크) - 준영속(더이상 영속성 컨텍스트에서 관리X) - 삭제(삭제된 상태)
  • 엔티티 매니져 : 엔티티를 CRUD 하는 관리자 역할, 쓰레드 간 공유해서는 안됨, 데이터베이스 연결이 필요한 시점까지 커넥션 풀에서 커넥션을 꺼내지않음
    • 코드에서 만드는 Repository가 엔티티 매니져
  • 엔티티 매니져 팩토리 : 엔티티 매니져를 생성하는 팩토리, 쓰레드 세이프함, 데이터베이스 연결에 필요한 커넥션들이 담긴 커넥션 풀을 생성함
    • 커넥션 : 데이터베이스 연결 정보를 가지고 있음, 쿼리를 실행하기위해서 데이터베이스와 연결하고, 쿼리 실행까지 해야함
  • 영속성 컨텍스트 : 바로 데이터베이스에 쿼리를 날리지않고, 영속성 컨텍스트라는 중간 계층을 거치도록 함, 중간 계층을 둠으로써 이점이 있음, 어플리케이션 메모리 사용(하나의 엔티티 매니져에 하나의 영속성 컨텍스트가 생성됨)
    • 1차 캐시, 동일성 보장 : 트랜잭션에서 조회한 엔티티를 캐시해둠 -> 동일 객체 리턴할 수 있게 됨
    • 트랜잭션 지원 지연쓰기 SQL 저장소 : 트랜잭션의 모든 작업을 처리 후 성공했을 때 한번에 SQL을 날리는데, 작업 마다 SQL을 생성해서 영속성 컨텍스트 내부에 저장소에 SQL을 저장해뒀다가 SQL을 한꺼번에 처리
    • 변경 감지 : 트랜잭션에서 조회한 엔티티가 변경되면 감지를 하고 UPDATE 쿼리를 만들고 데이터베이스에 날림