분류 전체보기
[JPA] 프록시와 연관관계
[JPA] 프록시와 연관관계
2022.12.24em.find 메서드를 사용하면 데이터베이스를 통해 실제 엔티티 객체를 조회하고, em.getReference 메서드를 사용하면 데이터베이스 조회를 미루는 프록시 엔티티를 조회한다. 여기서 프록시는 실제 엔티티 클래스를 상속받아서 만들어지고, 실제 클래스와 겉으로 보기에는 차이가 없다. 프록시에는 클래스의 값인 id와 name은 없지만 클래스를 가리키는 target을 가진다. getId() 또는 getName() 메서드가 프록시에 호출되면 target에 있는 getId()나 getName() 을 대신 호출하는 방식으로 동작한다. getReference 메서드를 사용하면 member의 프록시를 가져온다. 그 후 getName() 메서드를 호출하는데, 아직 target은 초기화되지 않아 실제 Entity를 ..
[시스템 프로그래밍] Bomb Lab Phase 3
[시스템 프로그래밍] Bomb Lab Phase 3
2022.12.23disas phase_3로 phase_3 함수를 어셈블리어로 조사해보자. +35줄에서 정수를 입력받는 것 같다. phase_2처럼 +28의 source 부분에 입력값의 형태가 저장돼 있을 것 같다. 어떤 형식으로 입력받는지 살펴보자. ni 명령어로 한 줄 씩 읽어가면서 source 부분을 확인해봤다. 정수 2개를 입력받는 것 같다. 적당히 break를 설정하고 두 개의 숫자를 입력해서 다시 실행해보자. 대충 3 4로 입력했다. +40줄에서 1과 eax의 값을 비교한다. 그러면 eax의 값을 알아야 하는데.. 다시 한 줄 씩 실행하면서 확인해보자. +40줄 까지 진행한 후 레지스터의 상태를 확인해보니 rax 레지스터에는 2가 저장돼있음을 확인할 수 있다. +43줄에서 jle 명령어가 실행된다. 2는 1보다..
[JPA] 상속관계 매핑
[JPA] 상속관계 매핑
2022.12.23객체에는 상속관계가 있지만 관계형 데이터베이스에는 상속 개념이 없다. 대신 슈퍼타입과 서브타입이라는 개념이 상속과 유사하고 상속과 유사하게 사용할 수 있다. 위와 같은 데이터베이스 논리 모델을 물리 모델으로 구현할 때 사용하는 전략으로는 세 가지가 있다. 1. Join Item Album Movie Book 테이블을 각각 만들고 join으로 데이터베이스를 구성하는 방식이다. insert를 두 번 하고 조회는 PK FK를 통해 join해서 조회한다. 상속하는 클래스에 @Entity 애너테이션과 함께 @Inheritance(strategy = InheritanceType.JOINED) 애너테이션을 사용해서 구현한다. DTYPE으로 테이블을 구별할 때는 @DiscriminatorColumn 애너테이션을 사용한..
[JPA] 다양한 연관관계 매핑
[JPA] 다양한 연관관계 매핑
2022.12.22연관관계 매핑에 대한 기본 지식을 쌓았으니, 설계 시 만날 수 있는 다양한 연관관계들에 대해 살펴보자. 다대일 [N : 1] 연관관계 매핑의 기본이다. 테이블에서 FK를 가진 요소를 기준으로 매핑하고 그래프 객체 탐색이 필요한 경우 양방향으로 확장한다. 일대다 [1 : N] 다대일의 반대이다. @JoinColumn 애너테이션을 사용하지 않으면 JoinTable 방식이 사용되니 주의하자. (성능이 저하되고 운영이 어려워진다) 데이터베이스에서 외래 키는 다(多) 쪽에 위치한다. 다대일에서와 다르게 외래 키를 관리하는 엔티티가 Team에서의 List members이고, List를 변경하면 데이터베이스가 변경된다. 객체와 테이블의 차이 때문에 외래 키를 반대편 테이블이 관리하게 되는 특이한 구조가 됐다. -_-..
[시스템 프로그래밍] Bomb Lab Phase 2
[시스템 프로그래밍] Bomb Lab Phase 2
2022.12.22disas phase_2 명령어로 phase_2 함수를 어셈블리어로 살펴보자. +25줄에서 함수를 호출한다. 이름 그대로 6개의 숫자를 입력받는 것 같은데.. 어셈블리어로 살펴보자. +41줄에 scanf 함수를 볼 수 있는데, 역시 숫자를 입력받는게 맞는 것 같다. 레지스터를 열어 보니 확실히 6개의 정수를 입력받는다. 나머지 내용은 잘 모르겠고.. 일단 read_six_numbers 함수에서 여섯 개의 정수를 입력받는다는 사실을 알아냈다. 다시 phase_2 함수로 돌아오자. +30줄에서 스택의 첫 번째 수가 1인지 확인하고 있다. +34줄에서 zero flag가 0이면 +45줄로 가서 폭탄을 터뜨린다. 아하! 스택의 첫 번째 값은 1이구나! 즉, 6개의 정수를 입력받을 때 첫 번째로 입력받는 정수는 ..
[JPA] 연관관계 매핑
[JPA] 연관관계 매핑
2022.12.22객체가 지향하는 패러다임과 관계형 데이터베이스가 지향하는 패러다임이 달라 객체 설계 시 테이블 설계에 맞춰서 설계하면 객체 그래프를 탐색할 때 문제가 생긴다. 테이블은 외래 키를 사용해 연관된 테이블을 찾고, 객체는 참조를 사용해 연관된 객체를 찾는다. 두 패러다임의 불일치 때문에 객체지향적으로 코드를 작성할 수 없다. 객체의 참조와 데이터베이스 테이블의 FK를 매핑해 패러다임의 불일치를 해결하자. 단방향 연관관계 Member와 Team을 묶는다고 생각해보자. Team에는 여러 Member가 속할 수 있다. (Member가 N, Team이 1인 상황이다) Member에 Team의 외래 키를 필드로 가지는 방식으로 설계하면 위에서 언급한 문제가 발생한다. 위와 같은 방식으로 설계하고 싶다. 이 때 @Man..
[JPA] 객체와 테이블 매핑
[JPA] 객체와 테이블 매핑
2022.12.22JPA가 영속성 컨텍스트 개념을 사용해 동작하는건 알겠는데, 자바 객체와 데이터베이스 테이블은 어떻게 매핑되는걸까? JPA에서 가장 중요한 부분은 자바 객체인 엔티티와 데이터베이스의 테이블을 정확하게 매핑하는 작업이다. JPA에서는 @Entity 애너테이션을 사용해서 엔티티를 관리한다. @Entity 애너테이션이 붙은 클래스는 데이터베이스 테이블과 매핑될 수 있다. 예전에는 xml 등 설정 파일을 사용해 매핑 정보를 작성했는데, 애너테이션을 사용하는 편이 좀 더 쉽고 직관적이다. @Entity 애너테이션의 속성으로 name을 지정해 JPA에서 사용할 엔티티 이름을 지정할 수 있고, @Table 애너테이션의 속성으로 name을 지정해 매핑할 테이블 이름을 지정할 수 있다. 엔티티 클래스는 public 또는..
[시스템 프로그래밍] Bomb Lab Phase 1
[시스템 프로그래밍] Bomb Lab Phase 1
2022.12.21gdb bomb 명령어로 디버깅 모드에 진입한 후 disas phase_1 명령어로 phase_1 함수가 어셈블리어로 어떻게 작성된 지 확인해봤다. +11 : 함수를 호출한다. +16 : %eax 레지스터를 test한다. +18 : 결과가 같지 않으면 +25로 점프한다. +25 폭탄이 터진다. 음.. +11줄에서 문자열 두 개를 비교하고 %eax 레지스터에 결과를 넣게 되고, 이 결과에 따라서 폭탄이 터지거나 안 터지게 되는 것 같다. 좀 더 자세하게 살펴보자. test 명령어는 두 피연산자를 and 연산한다. jne 명령어는 ZF가 0일 경우 실행된다. 즉, +11줄에서의 결과가 1이면 폭탄이 터지지 않고, 0이면 폭탄이 터지게 됨을 알 수 있다. 그렇다면 당연히 +11줄에서 두 개의 문자열이 같은 경..
[JPA] 영속성 컨텍스트
[JPA] 영속성 컨텍스트
2022.12.21자바 객체와 관계형 데이터베이스를 어떻게 매핑해서 사용해야 할까? 실제로 JPA는 내부적으로 어떻게 동작하는걸까? JPA의 작동 원리를 제대로 이해하기 위해서는 영속성 컨텍스트에 대해 이해해야 한다. 영속성 컨텍스트는 엔티티를 영구적으로 저장하는 환경으로, 눈에 보이지 않는 논리적인 개념이다. EntityManager를 생성하면 이에 대응하는 PersistenceContext 가 생성된다. 엔티티를 처음 만들면 엔티티는 비영속 상태이다. persist 메서드를 사용하면 엔티티가 영속 상태가 되어 영속성 컨텍스트에 관리된다. 즉, em.persist() 메서드는 단순히 데이터베이스에 값을 저장하는게 아니고, 엔티티를 영속화함을 의미한다. 그런데 왜 이런 매커니즘을 도입했을까? 객체와 데이터베이스 사이에 영..
[JPA] 도입
[JPA] 도입
2022.12.21Java Persistence API의 약자로 자바 진영의 ORM 기술 표준을 의미한다. JPA는 인터페이스이고, 인터페이스를 구현한 여러 구현체가 있는데 그 중 하이버네이트를 가장 많이 사용한다. 객체는 객체대로, 데이터베이스는 데이터베이스대로 설계하고 ORM 프레임워크가 객체와 데이터베이스간 차이를 해결해 데이터베이스를 자바 객체를 다루는 것 처럼 사용할 수 있도록 한다. 아예 밑바닥부터 구현되는건 아니고, JDBC API도 적절하게 사용한다. Persistence 클래스는 yml, xml 등 설정 정보를 읽고 EntityManagerFactory 클래스를 만든다. 그리고 필요할 때 마다 EntityManager를 만들어서 사용하는 방식으로 동작한다. EntityManager는 JPA에서 애플리케이션..
[시스템 프로그래밍] Data Lab
[시스템 프로그래밍] Data Lab
2022.12.201. bitNor int bitNor(int x, int y) { return (~x) & (~y); // use de morgan law to use able operands. } 드모르간 법칙을 사용해 사용 가능한 연산자만으로 bitNor를 구현하자. ~(x | y) => (~x) & (~y) 2. float_neg unsigned float_neg(unsigned uf) { int res = (0x80
[C++] 예외처리
[C++] 예외처리
2022.12.18C++ 에서 를 include하면 특정 데이터 타입이 표현할 수 있는 최대 / 최소 범위를 구할 수 있다. int 나 long 타입으로 변수를 지정하고, 해당 데이터 타입이 표현할 수 있는 수를 넘어선 수를 저장하면 어떻게 될까? 코드를 실행하는 환경에 따라 다르지만, 이 경우는 undefined behavior이다. (언어에 정의 돼 있지 않다) unsigned의 경우는 좀 다르다. undefined behavior가 아니다. unsigned의 경우 표현할 수 있는 수를 넘어선 수는 wrap around로 처리된다. unsigned 데이터 타입을 다루지 않는 경우 항상 undefined behavior에 의존해서 프로그램을 작성할 수 없으니 오버플로우나 언더플로우가 발생할 수 있는 연산은 연산 전에 체..