2022 Masters Course/Project Course

2022 마스터즈 코스(백엔드) 86일차 회고(2022. 5. 16.) - "2주차 개인 학습 정리 주간 시작"

ikjo 2022. 5. 17. 00:07

해당 글은 코드스쿼드 2022 마스터즈 코스 "Java 웹 백엔드" 과정을 수강하면서 학습한 내용 등에 대한 회고 글입니다. :)

 

수강 회고

오늘로 개인 학습 정리 2주차 주간이 시작되었다. 앞서 지난 1주차 개인 정리 주간 동안 학습했었던 JPA 프로그래밍과 데이터 베이스 그리고 하루에 알고리즘 문제 하나씩 풀기 등을 이번 2주차 주간에도 동일하게 적용하고자 한다. 다만, 지난 주간에는 JPA 프로그래밍과 데이터 베이스라는 무거운 학습 주제를 동시에 수행하면서 하나 하나 정리해가면서 학습해나가다보니 당초 목표했었던 진도에 턱없이 모자랐었는데, 이번 주간에는 학습의 깊이는 다소 가볍게 가져가더라도 진도를 나가는데 좀 더 집중하고자 한다.

 

아울러 내가 직종 전환을 하고 프로그래밍 학습을 시작한지도 벌써 만으로 1년이 넘었다. 1년이라는 시간은 길면 길고 짧으면 짧다고 할 수 있는 시간이다. 작년에는 독학을 하면서, 또 올해에는 코드스쿼드 마스터즈 코스 과정을 통한 학습을 수행하면서 정말 시간이 쏜살 같이 지나갔었던 것 같다. 내가 전 직장에서 근무한지 만으로 1년이 되었을 때를 생각해보면 사실 아직 직무가 제대로 숙달되있지는 않았을 때였다. 마찬가지로 지금 프로그래밍 역시 아직 제대로 숙달되있다고 생각하지 않으며, 프로그래밍을 시작한지 만으로 2년이 되는 그 날까지 앞으로의 1년도 부지런하게 학습해야할 필요성을 느낀다.

 

 

학습 회고

테이블간의 연간관계와 객체간의 연관관계

  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용해서 연관된 객체를 찾는다.

 

양방향 연관관계와 연관관계의 주인

  • 객체의 연관관계를 양방향으로 나타내려면 양 객체에 상대 객체를 필드로 가지고 있어야한다.
@Entity
public class Team {
	@Id @GeneratedValue
	private Long id;
	private String name;

	@OneToMany(mappedBy = "team")
	List<Member> members = new ArrayList<Member>();
}

@Entity
public class Member {
	@Id @GeneratedValue
	private Long id;
	@Column(name = "USERNAME")
	private String name;
	private int age;

	@ManyToOne
	@JoinColumn(name = "TEAM_ID")
	private Team team;
}

 

  • 반면에 테이블의 양방향 연관관계는 외래키 하나로 양방향이 다 존재하게 된다.
CREATE TABLE TEAM (
	TEAM_ID INT NOT NULL AUTO_INCREMENT,
	NAME VARCHAR(255)
);

CREATE TABLE MEMBER (
	MEMBER_ID INT NOT NULL AUTO_INCREMENT.
	TEAM_ID INT,
	USERNAME VARCHAR(255),
	PRIMARY KEY (MEMBER_ID),
	FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);

 

  • 객체간 양방향 연관관계를 설정 할 때는 두 객체 중 하나를 연관관계의 주인으로 지정해야한다.
    • 연관관계의 주인이 아닌 쪽에서는 읽기만 가능하며 mappedBy(`~에 의해 매핑되다`) 속성을 통해 주인을 지정한다. → mappedBy는 가짜 매핑
    • 이때 연관관계의 주인만이 외래 키를 관리(등록, 수정)할 수 있으며 연관관계의 주인은 mappedBy 속성을 사용하지 않는다.
public class Team {

    // ...

    @OneToMany(mappedBy = "team") // Member.team
    private List<Member> members = new ArrayList<>();

}

public class Member {

    // ...

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

}

 

  • 누구를 주인으로? → 외래 키가 있는 곳을 주인으로 정한다.
    • 위 테이블에서는 Member 테이블에 외래 키가 있으므로 Member.team을 연관관계의 주인으로 한다. 이는 진짜 매핑으로서 연관관계의 주인이 되며 외래 키를 관리(등록, 수정)할 수 있다.
    • 반면에 Team.members는 가짜 매핑으로서 주인의 반대편이 되며 읽기만 할 수 있다.
    • DB 입장에서는 외래 키가 있는 곳이 항상 N이고 외래 키가 없는 곳이 항상 1이다.(N : 1)
      • 즉, N쪽이 항상 연관관계의 주인이 된다.

 

 

학습 참고자료

  • 인프런 "자바 ORM 표준 JPA 프로그래밍 - 기본편" 

 

 

좋았던 점

  • 오늘 호눅스의 마스터 클래스 강의 덕에 MySQL 데이터베이스의 클러스트링 인덱스, 페이지 구조 등을 학습하는 유익한 시간을 가질 수 있었습니다. 👍

 

 

아쉬웠던 점

  • 오늘 늦잠 자서 오전 소모임 스크럼에 참여하지 못한 점이 아쉬웠습니다. 💦

 

 

이전 보다 개선되었던 점

  • 지난 주 데이터 베이스에 대해서 학습했었던 것과 오늘 호눅스의 마스터 클래스 강의를 통해 이전 보다 아주 조금은 데이터베이스에 대해 알게 된 것 같습니다. 🥕