[인프런 워밍업 스터디 클럽 1기] 3주차 발자국

[인프런 워밍업 스터디 클럽 1기] 3주차 발자국

발자국

현재 44강을 학습 중이며 Mysql 설치과정 중 오류로 인해 헤매고 있지만 남은 기간 미니 프로젝트과 완강을 위해 노력하겠다.


3주차 학습 내용

DAY11 : 객체지향과 JPA 연관관계

34강. JPA 연관관계에 대한 추가적인 기능들

1 : 1 관계

사람과 실거주지를 예시로 들 수 있다.

@Entity
public class Person {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id = null;
	...
	...
	private Address address;

}
@Entity
public class Address {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id = null;
	...
	...
	private Person person;

}

서로 연결되어 있긴 하지만 테이블에서는 한쪽만 id를 가지고 있으면 된다. person 테이블이 address 테이블의 id를 가질 수도 있고, 그 반대 일 수도 있다.

create table person 
(
	id bigint auto_increment,
	name varcher(255),
	address_id bigint,
	primary key (id)
);
create table address 
(
	id bigint auto_increment,
	...
	...
	primary key (id)
);

이렇게 한쪽의 id만 가지고 있으면 된다.

하지만 이런 경우 연관관계의 주인은 Person이다.

서로 @OneToOne 어노테이션을 붙여주어야 한다.

또한, 주인이 아닌 곳에 mappedBy를 붙여주어야 한다.

@Entity
public class Person {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id = null;
	...
	...
	@OneToOne
	private Address address;

}
@Entity
public class Address {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id = null;
	...
	...
	@OneToOne(mappedBy = "address")
	private Person person;

}

연관관계의 주인 효과는 객체를 연결시켜주는 것이다.

N : 1 관계 - @ManyToOne과 @OneToMany

연관관계의 주인은 무조건 N 쪽이다.

또한, @ManyToOne은 단방향으로만 사용할 수 있다.

@JoinColumn

연관관계의 주인이 활용할 수 있는 어노테이션

필드의 이름이나 null 여부, 유일성 여부, 업데이트 여부 등을 지정

N : M 관계 - @ManyToMany

학생과 동아리를 생각하면 된다.

한 학생은 여러 동아리에 속할 수 있고, 한 동아리 또한 여러 학생이 들어올 수 있다.

하지만 N : M 관계는 구조가 복잡하고, 테이블이 직관적으로 매핑되지 않아 사용하지 않는 것을 추천한다.

N : M 관계는 N : 1 관계로 풀어해칠 수 있기 때문이 이러한 방법을 추천한다.

cascade 옵션

한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능

orphanRemoval 옵션

객체간의 관계가 끊어진 데이터를 자동으로 제거하는 옵션

 

35강 책 대출/반납 기능 리페토링과 지연 로딩

영속성 컨텍스트의 4번째 능력 - 지연로딩

@OneToMany 어노테이션 안에는 fetch 속성이 있다. 기본적으로 LAZY, 지연로딩으로 되어 있지만, 필요한 순간에 가져오는 것이 아닌 한번에 다 가져오고 싶다면 fetch를 EAGER로 설정하면 된다.

연관관계를 사용하면 무엇이 좋을까?

  • 각자의 역할에 집중 (= 응집성)

  • 새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.

연관관계를 사용하는 것이 항상 좋을까?

지나치게 사용하면, 성능상의 문제가 생길 수도 있고 도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.

다양한 부분을 고민해서 연관관계를 사용해야 한다.

 

DAY12 : 기본적인 배포를 위한 준비

37강. 배포란 무엇인가?

배포

최종 사용자에게 SW를 전달하는 과정 → 전용 컴퓨터에 우리의 서버를 옮겨서 실행하는 것

우리는 전용 컴퓨터가 없기 때문에 AWS에 서버를 옮겨서 실행하는 일련의 과정을 공부해보자.

38강. profile과 H2 DB

전용 컴퓨터는 대부분 리눅스 사용하는데 리눅스 환경에 설치한 java와 mysql을 실행한다.

똑같은 서버 코드를 실행하지만 우리 컴퓨터와 전용 컴퓨터의 각각의 java와 mysql를 사용해야 한다.

여기서 profile이라는 개념이 등장한다.

Profile 적용

똑같은 서버 코드를 실행하지만 local 이라는 profile을 입력하면, H2 DB를 사용하고 dev 라는 profile을 입력하면, My SQL DB를 사용해보자

H2 DB

경량 데이터베이스로, 개발 단계에서 많이 사용하며 디스크가 아닌 메모리에 데이터를 저장할 수 있다. 메모리의 데이터는 휘발되기 때문에 개발 단계에서 많이 사용된다. 이러한 이유는 개발단계에서는 수정사항이 많기 때문에 데이터가 휘발되는 것이 장점으로 바뀐다.

profile 환경 구성 (application.yml)

spring:
  config:
    activate:
      on-profile: local
  datasource:
    url: "jdbc:h2:mem:library;MODE=MYSQL;NON_KEYWORDS=USER"
    username: "sa"
    password: ""
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        dialect: org.hibernate.dialect.H2Dialect
  h2:
    console:
      enabled: true
      path: /h2-console

---
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: "jdbc:mysql://localhost/library"
    username: "root"
    password: ""
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

http://localhost:8080/h2-console 를 통해 h2 DB에 직접 접근할 수 있다.

39강. git과 github이란 무엇인가?

git

코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램

github

git으로 관리되는 프로젝트의 코드가 저장되는 저장소

40강. git 기초 사용법

레포지토리 생성

인텔리제이 터미널

  • git init : 깃 초기화

  • git remote : 현재 프로젝트에 등록된 저장소 확인

  • git add . : 작업 디렉토리 상의 변경 내용의 전체를 스테이징 영역에 추가

  • git commit : 스테이징 영역의 상태를 버전으로 기록

  • git push : 원격 저장소에 코드 변경분을 업로드

  • git pull : 원격 저장소의 코드를 다운로드

41강. AWS의 EC2 사용하기

AWS 회원가입과 EC2 인스턴스 생성에 대한 일련의 과정을 배울 수 있었다.

 

DAY13 : AWS와 EC2 배포

43강. EC2에 접속해 리눅스 명령어 다뤄보기

aws ec2 터미널을 통한 접속방법

  1. 생성한 키페어 권한 설정

    chmod 400 //키페어경로
    
    • 키페어의 경로는 키페어를 터미널로 드래그하면 경로를 바로 쓸 수 있다.

  2. ssh 접속

    ssh -i 키페어경로 ec2-user@퍼블릭주소
    

aws 콘솔로 직접 접속하는 방법도 있지만 많은 서버를 관리하기에는 불편하다.

기본적인 리눅스 명령어

  • mkdir : 폴더를 만드는 명령어

  • ls : 현재 위치에서 폴더나 파일을 확인하는 명령어

  • ls -l : 조금 더 자세한 정보를 확인할 수 있다

     

    이때, drwxrwxr-s 2 ec2-user ec2-user 6 5월 18 08:47 을 볼 수 있다.

     

     

    drwxrwxr-s 2 ec2-user ec2-user 6 5월 18 08:47

     

    r : 읽을 수 있는 권한

     

    w : 쓸 수 있는 권한

     

    x : 실행할 수 있는 권한

     

    초록색 : 소유자의 권한

     

    파란색 : 소유그룹의 권한

     

    주황색 : 아무나 접근했을 때의 권한

     

    2

    : 폴더에 걸려 있는 바로가기 개수

     

    ec2-user : 소유주 이름

     

    ec2-user : 소유그룹

     

    6 : 폴더의 크기 (byte)

     

    5월 18 08:47 : 파일의 최종 변경 시각

 

  • cd : 폴더 안으로 들어가는 명령어

  • pwd : 현재 위치를 확인하는 명령어

  • cd.. : 상위 폴더로 이동하는 명령어

  • rmdir : 비어있는 폴더를 제거하는 명령어


3주차 과제

과제6

과제4에서 만들었던 API를 분리해보며, Controller - service - Repository 계층에 익숙해져 봅시다.

지난 주차 과제4에서 못한 부분이 많아 2주차 발자국에 따로 작성하지 않았다.
이번 과제를 통해 과제4에서 구현하지 못했던 API를 완성하고 각 계층의 역할에 조금 더 이해할 수 있는 시간이 되었던 것 같다.

과제7

과제6에서 만들었던 Fruit 기능들을 JPA를 이용하도록 변경해보세요.
또한, 저장되었던 과일 개수 조회 API, 판매되지 않은 특정 금액 이상 혹은 이하의 과일 목록 조회 API 작성

 

API를 작성하는 과정은 그렇게 힘들지 않았던 것 같다. 다만 JPA 환경 세팅을 하면서 힘들었던 부분이 있었다.

이후 API를 작성하는 과정에서 기억에 남는 부분은 스네이크 케이스 오류이다. JPA를 사용하면서 기존의 쿼리를 어떻게 사용해야 할지 고민하면서 스네이크 케이스로 인해 오류가 발생하였다. 그래서 @Column 어노테이션을 통해 객체의 이름을 바꾸어 매핑하여 사용하였다. 과제나 강의를 들으면서 오류와 마주할 때마다 힘들지만 경험이 쌓이면서 성장하는 느낌을 받는다.

 

댓글을 작성해보세요.

채널톡 아이콘