분류 전체보기
[Spring Data JPA] 벌크 연산과 EntityGraph
[Spring Data JPA] 벌크 연산과 EntityGraph
2023.01.02JPA를 공부할 때 배웠듯, 한 번에 여러 데이터들을 한 번에 수정하는 경우 벌크 연산을 사용한다. Spring Data JPA에서 벌크성 수정 쿼리를 작성할 때는 @Modifying 애너테이션이 붙는다. 벌크 연산은 영속성 컨텍스트를 무시하고 바로 데이터베이스에 쿼리를 보내기 때문에 영속성 컨텍스트로 관리되는 엔티티의 상태와 데이터베이스에 저장된 데이터가 서로 일치하지 않는 경우가 발생할 수 있다. 따라서 벌크 연산을 수행한 이후 flush와 clear함수를 실행해 영속성 컨텍스를 초기화 하는 방법을 사용하자. @Modifying(clearAutomatically = true) 로 설정하면 해당 애너테이션이 붙은 메서드가 실행된 후 영속성 컨텍스트가 자동으로 초기화된다. Spring Data JPA에서..
[Spring Data JPA] 쿼리 메서드와 페이징
[Spring Data JPA] 쿼리 메서드와 페이징
2023.01.02Spring Data JPA 기술을 사용해 회원의 이름과 나이를 기준으로 조회하는 기능을 구현한다고 생각해보자. 공통으로 제공하는 메서드가 아니기 때문에 별도로 처리해 줘야 하는데, 이 때 쿼리 메서드 기능을 사용하면 매우 편하게 처리할 수 있다. 쿼리 메서드를 사용하면 이전처럼 JPQL을 하나하나 작성하지 않아도 된다. 쿼리 메서드는 메서드의 이름을 바탕으로 JPQL을 만들어주는 기술이다. 위와 같이 메서드의 이름을 적절하게 작성하고 매개변수를 설정하면 직관적으로 어떤 JPQL이 만들어지는지 유추할 수 있따. 이 때 아무 이름이나 사용하면 안 되고, 관례가 있다. 이름에 사용되는 관례는 (https://docs.spring.io/spring-data/jpa/docs/current/reference/ht..
[Spring Data JPA] 공통 인터페이스
[Spring Data JPA] 공통 인터페이스
2023.01.02기존에는 JPA를 사용해 원하는 기능을 하나하나 작성해 줘야 했지만, Spring Data JPA기술을 사용하면 개발을 훨씬 편하게 할 수 있다. 단순하게 인터페이스를 만들고 JpaRepository 클래스를 상속받는것만으로도 Spring Data JPA의 기능을 사용할 수 있다. 그런데 구현체가 아닌 인터페이스를 사용하는데 어떻게 기능을 사용할 수 있을까? Spring Data JPA는 인터페이스를 통해 구현체를 만들고 주입해준다. 애플리케이션이 로딩될 때 개발자가 만들어놓은 인터페이스를 보고 구현 클래스를 만드는 방식으로 작동한다. (프록시) 개발자는 JpaRepository 클래스의 제네릭스만 적당히 설정해주면 Spring Data JPA의 기능을 사용할 수 있고, 인터페이스에는 @Repositor..
[JPA] OSIV
[JPA] OSIV
2022.12.31Open Session In View의 약자이다. JPA가 영속성 컨텍스트를 관리하기 위해서는 먼저 데이터베이스 커넥션을 획득해야한다. 데이터베이스의 트랜잭션이 시작될 때 JPA의 영속성 컨텍스트가 데이터베이스 커넥션을 획득하는데.. 언제 반환하는걸까? OSIV가 켜져 있는 경우 최초의 데이터베이스 커넥션을 획득하고 API의 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 즉, 트랜잭션이 끝나도 데이터베이스 커넥션을 반환하지 않는다. 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 데이터베이스 커넥션이 있어야 관리된다. 따라서 OSIV가 켜져 있으면 지연 로딩이 가능하다. 그런데... 데이터베이스 커넥션을 계속 들고 있으면 사용자가 많은 애플리케이션인 경우 데..
[시스템 프로그래밍] Bomb Lab Phase Secret
[시스템 프로그래밍] Bomb Lab Phase Secret
2022.12.30phase_defused 함수에서 secret_phase를 해결할 수 있다. disas phase_defused 명령어로 어셈블리어를 조사하자. +184줄에서 secret_phase를 호출함을 찾을 수 있다. 이제 어떻게 secret_phase 함수를 호출할지 생각해보자. +30 : 6과 어떤 값을 비교해서 같으면 +64줄로 점프한다. 여기서 비교하는 값은 각 페이즈를 defuse 할 때 마다 1씩 증가한다. phase_6까지 defuse 했으니 secret_phase로 접근하는 조건을 갖췄다. +79줄과 +86줄에서 뭔가 입력받는 것 같다. 레지스터를 출력해서 어떤 형식으로 입력받는지 알아보자. 정수 두 개와 문자열 하나를 입력받는다. 아래에서 string_not_equal 함수를 호출하고 있다. ph..
[JPA] JPQL (2)
[JPA] JPQL (2)
2022.12.28경로 표현식 점을 찍어 상태에 접근하는 방법을 객체 그래프 탐색이라고 부른다. 객체 그래프 탐색으로 필드에 접근하는 요소에 따라 상태 필드 / 단일 값 연관 필드 / 컬렉션 값 연관 필드로 구분된다. 상태 필드는 단순히 값을 저장하기 위한 필드를 의미한다. 연관 필드는 연관관계를 위한 필드로, 엔티티 또는 컬렉션을 대상으로 하는 탐색을 의미한다. 상태 필드는 경로 탐색의 끝으로, 더 이상 탐색할 수 없다. (chaining 불가능) 단일 값 연관 필드로 탐색을 수행하면 묵시적 내부 조인이 발생한다. 따라서 쿼리 튜닝이 어려우니.. 조심해서 사용해야 한다. 컬렉션 값 연관 필드로 탐색 수행 시 더 이상 탐색할 수 없다. 경로 탐색의 끝이 아님에도 탐색이 불가능하니, 꼭 탐색이 필요한 경우 FROM 문법으로..
[시스템 프로그래밍] Bomb Lab Phase 6
[시스템 프로그래밍] Bomb Lab Phase 6
2022.12.27disas phase_6 명령어로 phase_6의 어셈블리어를 조사하자. phase_6은 마지막 페이즈라서 그런지 어셈블리 코드가 정말 길다. 일단 익숙한 함수인 read_six_numbers가 보인다. 이번에도 6개의 정수를 입력받는 것 같다. 항상 하던대로 phase_6에 브레이크를 설정하고 아무 숫자나 입력해보자. 대충 3 4 5 6 7 8을 입력했다. 이제 어셈블리어의 흐름을 쭉 따라가보자. +34 : read_six_numbers 함수를 호출해 6개의 정수를 읽는다. +42 : r14d에 0을 저장한다. +48 : +87줄로 점프한다. r13에는 처음 입력한 숫자인 3이 저장돼있다. +87과 +90줄에서 r13값을 rbp와 eax에 저장한다. +94 : eax에서 1을 뺀다. +97 : eax에..
[JPA] JPQL (1)
[JPA] JPQL (1)
2022.12.27JPA를 사용하면 기본적인 SQL은 알아서 작성되기 때문에 개발할 때 매우 편하다. 하지만 복잡한 SQL은 개발자가 직접 작성해야 하는데, sql을 작성하는 기술 중 하나가 JPQL이다. JPA는 엔티티 객체를 중심으로 개발하기 때문에 검색 시에도 테이블 대신 엔티티 객체를 대상으로 검색할 수 있어야 한다. 데이터베이스에 있는 모든 데이터를 객체로 변환하는 방법은 너무 비효율적이다. 어쩔 수 없이 SQL이 사용된다. JPA는 SQL을 추상화한 언어인 JPQL이라는 객체지향 쿼리 언어를 제공한다. 문법은 SQL과 유사하지만 JPQL은 객체를 대상으로 쿼리를 날리고 SQL은 데이터베이스 테이블을 대상으로 쿼리를 날린다는 차이점이 있다. JPQL을 실행하면 해당 JPQL을 분석해서 적절한 SQL을 만들어 데이..
[JPA] 값 타입
[JPA] 값 타입
2022.12.26값 타입은 복잡한 객체를 단순화하기 위해 도입된 개념이다. JPA는 데이터 타입을 두 가지로 분류한다. 1. Entity @Entity 애너테이션으로 지정하는 객체를 의미하고, 데이터가 변해도 식별자로 추적할 수 있다. PK를 사용해 데이터를 찾고 데이터를 추적할 수 있다고 생각하면 된다. 2. 값 타입 자바의 Primitive 타입과 객체를 의미한다. 식별자가 없으니 값이 변경돼도 추적할 수 없고, 생명 주기를 엔티티에 의존한다. 값 타입은 다시 세 가지로 분류된다. 기본 값 타입 : Primitive 타입과 래퍼클래스, String을 의미한다. 임베디드 타입 : 사용자가 임의로 만든 객체를 의미한다. 컬렉션 값 타입 : ArrayList처럼 기본 값 또는 임베디드 타입을 넣어서 사용하는 객체를 의미한..
[시스템 프로그래밍] Bomb Lab Phase 5
[시스템 프로그래밍] Bomb Lab Phase 5
2022.12.25disas phase_5 명령어로 phase_5의 어셈블리어를 조사하자. +4줄에서 string_length 함수를 호출한다. 문자열의 길이? 어떤 함수일까? 뭔가 조건이 만족 될 때 까지 반복하는 함수 인 것 같다. 입력받은 문자열 내부를 순회하면서 문자열에 따라 특정 값을 계속해서 더하는 것 같은데.. 우선은 phase_5를 계속 조사하자. 다시 phase_5로 돌아와서, +9줄에서 string_length 함수의 반환값이 6과 같은지 검사하고, 6이 아니면 폭탄을 터뜨림을 확인할 수 있다. 그러면 phase_5의 입력 양식은 길이가 6인 문자열 일텐데.. 일단 길이가 6인 아무 문자열이나 입력하고 디버깅해보자. 대충 aaaccc를 입력했다. rdi 레지스터에 입력 값이 저장됨을 확인할 수 있다. +..
[JPA] 영속성의 전이와 고아 객체
[JPA] 영속성의 전이와 고아 객체
2022.12.24부모 엔티티를 영속 상태로 만들때 자식 엔티티도 함께 영속 상태로 만드는 등 특정 엔티티를 영속 상태로 만들때 연관된 엔티티도 함께 영속 상태로 만드는 작업을 영속성의 전이라고 한다. @OneToMany 애너테이션에 cascade 속성을 CascadeType.ALL으로 설정하면 영속성의 전이를 사용할 수 있다. 연관관계의 매핑과는 아무런 상관 없고 그냥 엔티티를 영속화할 때 관련된 엔티티를 함께 영속화할 수 있어 좀 더 편하게 개발할 수 있다는 의미를 가진다. 해당 엔티티가 단일 엔티티에 종속적인 경우 사용하면 좋지만, 엔티티가 복잡하게 엮여있는 경우 의도하지 않은 결과가 발생할 수 있으니 조심해서 사용하자. 영속성의 전이와 비슷한 개념으로 고아 객체 개념이 있다. 부모 엔티티와 연관관계가 끊어진 자식 ..
[시스템 프로그래밍] Bomb Lab Phase 4
[시스템 프로그래밍] Bomb Lab Phase 4
2022.12.24항상 하던대로 먼저 phase_4의 어셈블리어를 조사하자. +35줄에서 입력받는 부분이 바로 보인다. phase_2와 phase_3에서 한 것처럼 입력 형식을 살펴보자. 이번에도 두 개의 정수를 입력받는다. 두 개의 정수이니, 대충 1 2를 입력하고 한 줄 씩 진행해보자. +40 줄에서 eax값과 2를 비교하고, +43에서 두 값이 다른 경우 폭탄을 터뜨린다. +40줄에서 레지스터의 값을 확인해보니 rax에 2가 저장돼있었다. 따라서 43줄에서 폭탄은 터지지 않는다. 아마 두 개의 입력이 잘 들어왔는지 확인하는 부분 인 것 같다. 이후 +45줄에서 0xe와 rsp에 있는 값을 비교한다. rsp에는 입력한 값인 1과 2가 저장돼있다. +49줄에서 +45줄의 결과에 따라 폭탄을 터뜨린다. 0xe는 10진수로..