4.1 The Y86-64 Instruction Set Architecutre 4.1.1 Programmer-Visible State Y86-64의 각 명령어들은 프로세서 상태의 어떤 부분을 읽고 수정할 수 있다. 프로그래머에게 보여지는 상태(programmer-visible state)라고 하며, 프로그래머는 어셈블리 코드로 프로그램을 작성할 수 있고 기계 수준의 코드를 생성하는 컴파일러를 작성할 수 있다. 15개의 프로그램 레지스터가 있다. (%rax, %rax, %rcx, %rdx, %rbx, %rsp, %rbp, %rsi, %rdi, and %r8 through %r14) 각 레지스터들은 64비트 word를 저장한다. 레지스터 %rsp는 push, pop, call, return 명령어를 이용하여..
JPQL 경로 표현식 - .을 찍어 객체 그래프 탐색 - 상태 필드 (state field) : 단순히 값을 저장하기 위한 필드 - 연관 필드 (association field) : 연관관계를 위한 필드 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 - 상태 필드: 경로 탐색의 끝, 탐색 X - 단일 값 연관 경로: 묵시적 내부 조인 발생, 탐색 O - 컬렉션 값 연관 경로: 묵시적 내부 조인 발생, 탐색 X 명시적 조인, 묵시적 조인 - 명시적 조인 : join 키워드 직접 사용 select m from Member m join m.team t - 묵시적 조인 : 경로 표현식에 의해 묵시적으..
JPA는 다양한 쿼리 방법을 지원 - JPQL - JPA Criteria - QueryDSL - Native SQL - JDBC API, MyBatis, SpringJdbcTemplate JPQL - 문제는 검색 쿼리 - 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 - 검색 조건이 포함된 SQL이 필요 - JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 - SQL과 문법 유사 - JPQL은 엔티티 객체를 대상으로 쿼리 - SQL은 데이터베이스 테이블을 대상으로 쿼리 String query = "select m From Member m where m.name like '%hello%'"; List result = em.createQuery(query, Member.clas..
기본값 타입 JPA의 데이터 타입 분류 - 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 - 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 값 타입의 분류 - 기본값 타입 : 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String - 임베디드 타입(embedded type, 복합 값 타입) - 컬렉션 값 타입(collection value type) 기본값 타입 - ex) String name, int age - 생명주기를 엔티티에 의존 : ex) 회원을 삭제하면 이름(name), 나이(age) 필드도 함께 삭제 - 값 타입은 ..
프록시 프록시 기초 - em.find() vs em.getReference() - em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 - em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 - 실제 클래스를 상속받아서 만들어진다. - 실제 클래스와 겉모양이 같다. - 이론상 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. - 프록세 객체는 실제 객체의 참조(target)을 보관 - 프록시 객체를 호출하면 프록시 개체는 실제 객체의 메소드 호출 프록시 객체의 초기화 Member member = em.getReference(Member.class, member.getId()); member.getName()..
상속관계 - RDB는 상속 관계가 없다. - 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 - 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 - 각각의 테이블로 변환 -> 조인 전략 - 통합 테이블로 변환 -> 단일 테이블 전략 - 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 주요 어노테이션 - @Inheritance(strategy = InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 - @DiscriminatorColumn(name = "DTYPE"), @Discri..
연관관계 매핑 시 고려사항 3가지 - 다중성 - 단방향, 양방향 - 연관관계의 주인 다중성 - 다대일(N:1) : @ManyToOne - 일대다(1:N) : @OneToMany - 일대일(1:1) : @OneToOne - 다대다(N;M) : @ManyToMany 단방향, 양방향 - 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없다 - 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조 가능하면 단방향, 양쪽이 서로 참조하면 양방향 연관관계의 주인 - 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 - 객체 양방향 관계는 참조가 2군데 - 객체 양방향 관계는 둘 중 테이블의 외래 키를 관리할 곳을 지정해야함 - 연관관계의 주인 : 외래 키를 관리하는 참조 - 주인의 반대편 : ..
- 객채와 테이블 연관관계의 차이를 이해 - 객체의 참조와 테이블의 외래 키를 매핑 연관관계가 필요한 이유 예시 시나리오 - 회원과 팀이 있다. - 회원은 하나의 팀에만 소속될 수 있다. - 회원과 팀은 다대일(N:1) 관계 객체를 테이블에 맞추어 모델링 (연관관계 없음) Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setName("member1"); members.setTeamId(team.getId()); em.persist(member); Member findMember = em.find(Member.class, member.getId()); Team findTe..
그래프(Graph)는 G = (V, E)로 표현 가능하다 그래프는 V는 정점(Vertex)이고 E는 간선(Edge)로 구성되어 있다. 많은 알고리즘 문제들을 푸는 핵심은 그래프의 측면에서 생각하는 것 그래프의 특징 - 무방향(undirected) 그래프 vs 방향(directed) 그래프 G = (V, E)에서 (x, y) 간선이 (y, x)을 의미하면 무방향 그래프, 아니면 방향 그래프 - 가중(weighted) 그래프 vs 비가중(unweighted) 그래프 각 에지에 가중치라고 부르는 수치가 할당 두 정점 사이의 최단 경로를 구할 때 분명해진다 비가중 그래프에서 최단 경로는 최소 에지의 개수이며 BFS로 구할 수 있다. - 단순(simple) 그래프 vs 비단순(non-simple) 그래프 자기-루..
객체와 테이블 매핑 @Entity - @Entity가 붙은 클래스는 JPA가 관리 - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 속성 : name - JPA에서 사용할 엔티티 이름 지정 (기본값: 클래스 이름) @Table - @Table은 엔티티와 매핑할 테이블 지정 데이터베이스 스키마 자동 생성 - DDL(Database Definition Langauge)을 애플리케이션 실행 시점에 생성 - 테이블 중심 -> 객체 중심 - 데이터베이스 Dialect에 맞게 적절한 DDL 생성 - 개발 장비에서만 사용, 운영서버에서는 사용하지 않는다 속성 hibernate.hbm2ddl.auto - 운영 장비에는 절대 create, create-drop, update 사용하면 안된다 - 제약 조건..