개발자는 연결하는 역할을 하는 맵퍼이다.



테이블에서 쓰는 PK 와 FK 는 무엇일까?

PK(Pimary Key, 기본 키): PK는 각 행을 고유하게 식별하는 열(또는 열 집합)을 말합니다. PK는 고유성과 무결성을 보장해야 하며, NULL 값을 허용하지 않습니다. 예를 들어, 학생 정보를 저장하는 테이블에서 각 학생의 고유 번호를 PK로 설정할 수 있습니다.

FK(Foreign Key, 외래 키): FK는 다른 테이블의 행을 참조하는 열(또는 열 집합)을 말합니다. FK는 참조 무결성을 보장하는데 사용되며, 참조하는 PK 값이 변경되거나 삭제될 때 해당 FK 값을 갖는 행의 처리 방식을 정의합니다. 예를 들어, 학생이 수강하는 과목을 저장하는 테이블에서 학생의 고유 번호를 FK로 설정하면, 학생 테이블의 PK를 참조하게 됩니다.

이러한 PK와 FK는 테이블 간의 관계를 정의하고, 데이터의 일관성과 무결성을 유지하는 데 중요한 역할을 합니다.

<aside> 💡 기본키와 외래키에 대해서

기본 키 (Primary Key, PK) 기본 키는 데이터베이스의 테이블에서 각각의 행을 고유하게 식별하는 열(또는 열 집합)을 의미합니다. 이는 테이블에서 각 행이 반드시 고유해야 함을 보장하기 위해 사용되는 기능입니다.

기본 키의 특징

  1. 유일성: 기본 키로 지정된 열의 값은 각 행마다 달라야 합니다. 즉, 중복된 값이 있어서는 안됩니다.
  2. 무결성: 기본 키로 지정된 열의 값은 결코 NULL이 될 수 없습니다. 즉, 반드시 값이 존재해야 합니다.
  3. 변동성: 일단 기본 키로 설정된 열의 값은 변경할 수 없습니다.

외래 키 (Foreign Key, FK) 외래 키는 한 테이블의 필드가 다른 테이블의 기본 키를 참조하는 것을 말합니다. 이를 통해 두 테이블 간의 연결을 만들고, 테이블 간의 관계를 형성합니다.

외래 키의 특징

  1. 참조 무결성: 외래 키 값은 참조하는 테이블의 기본 키 값 중 하나이거나 NULL이어야 합니다. 즉, 참조하는 테이블에 없는 값이 들어갈 수 없습니다.
  2. 관계성: 외래 키를 통해 테이블간의 관계를 형성하고, 데이터의 일관성을 유지합니다.

</aside>


엔티티 신뢰 문제

class MemberService{
	…
	public void process(){
		Member m = meberDAO.find(memberId);
		m.getTeam(); // ???
		m.getOrder().getDelivery(); // ????
	}
}

서비스 로직을 짜는데 이 DAO 코드를 다 열어봐야 아 여기서 어떤 쿼리를 가지고 세팅을 했는지를 다 봐야, 아 여기는 팀까지만 조회할 수 있겠구나. 이런 것들을 다 할수가 있게 된다.

그렇다면 모든 객체들을 미리 다 로딩을 할 수 있을까?

→ 어렵다. 왜냐면 sql 쿼리가 어마어마한 쿼리가 나와야하기 때문이다. 막, 다 조인하고 엄청나게 무시무시한 크기의 쿼리가 나오고 성능도 안나온다. → 한번에 데이터를 사용하지도 않는 데이터를 무조건 다 퍼올려놔야 되니까 그렇다. 그래서 우리가 sql을 많이 쓰게 되면, memberDAO.getmember() 이런걸 만들면 얘는 멤버만 조회하는 것이다. 그 다음에 memberDAO.getMemberWithTeam(); 이라고 메서드명을 만든다. 그러면 얘는 멤버랑 팀까지 세팅 되있겠구나 한다. 그렇지만 이게 한 두개가 아니라 멤버 오더 딜리버리 다 조회해야 한다면 ?? 다 getOrder, getMember등등 해야한다. 모든 객체를 미리 로딩할 수도 없고. 난감하다. 여기서 하고 싶은 말은, 계층형 아키텍처는 진정한 의미의 계층 분할이 어렵다는 것이다.

Untitled

이렇게 비교를 하게 되면 다른 인스턴스 2개가 생성된다는 것이다.

그런데 이 비교하기를 db가 아닌 자바 컬렉션에서 하게 된다면 ? →같은 인스턴스를 참조하게 되는 것이다.(인스턴스 자체가 같음)

즉, 하고 싶은 말은 객체답게 모델링 할수록 매핑 작업만 늘어난다는 것이다.

→ 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수는 없는 것일까???