🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

인프런 워밍업 클럽 BE 1기 - 3주차 발자국

인프런 워밍업 클럽 BE 1기 - 3주차 발자국

학습한 내용

영속성 컨텍스트(Persistence Context)

  • 테이블과 매핑된 Entity 객체를 관리/보관하는 역할을 한다.

  • 스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생성되고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.

  • 영속성 컨텍스트의 특성들을 통해, 데이터의 일관성을 유지하고, 데이터베이스와의 통신 효율을 높일 수 있다.

     

    기능

    1. 변경 감지(Dirty Check)

      1. 영속성 컨텍스트 안에서 불러와진 Entity 객체는 명시적으로 save하지 않더라도, 변경을 감지를 통해 자동으로 저장된다.

    2. 쓰기 지연

      1. DB의 INSERT/UPDATE/DELETE에 대한 SQL을 즉시 보내는 것이 아니라, 트랜잭션이 COMMIT될 때 모아서 한 번만 날린다.

      2. 이렇게 하면 네트워크 비용과 데이터베이스 리소스 사용을 최소화하여 성능을 개선할 수 있다.

    3. 1차 캐싱

      1. 영속성 컨텍스트는 조회된 Entity를 내부 캐시에 저장한다.

      2. 같은 트랜잭션 내에서 동일한 Entity를 다시 조회할 때는 데이터베이스에 추가적인 쿼리를 실행하지 않고, 1차 캐시에서 직접 객체를 반환한다.

      3. 이렇게 되면 데이터베이스 접근 횟수를 줄여 성능을 향상된다.

      4. 캐싱된 객체는 완전히 동일하다.

         

    4. 지연 로딩(Lazy Loading)

      1. 연결되어 있는 객체를 꼭 필요한 순간에만 가져온다.

 

연관관계(Association)

두 개 이상의 테이블 또는 객체 간의 연결을 의미한다.

  • 1:1 관계

    • @OnnToOne

    • 한 테이블의 레코드가 다른 테이블의 단 하나의 레코드와만 관련

    • @JoinColumn

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

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

  • N:1 관계

    • @ManyToOne

      • 한 테이블의 한 레코드가 다른 테이블의 여러 레코드와 관련

      • N쪽(Many)에 @ManyToOne을 설정하고 1쪽(One)에 @OneToMany를 설정하여 양방향 매핑을 구성

      • 양방향이 아닌 단방향으로 사용할 수 있다.

      • 연관관계의 주인은 @ManyToOne을 사용한 쪽으로 설정

  • N:M 관계

    • @ManyToMany

      • 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 관련

      • 구조가 복잡하고, 테이블이 직관적으로 매핑되지 않아 사용하지 않는 것을 추천

      • 중간 엔티티(Join Table)를 두고 @OneToMany, @ManyToOne으로 해결하는 방법을 권장

         

연관관계의 주인

  • JPA에서는 연관관계의 주인을 정해 FK를 관리한다.

  • 연관관계의 주인이 외래 키를 관리(등록, 수정)하며, 주인이 아닌 쪽은 읽기만 가능하다.

  • 연관관계의 주인이 아닌 쪽에 mappedBy 옵션을 통해 소유자를 지정한다.

     

    효과

  • 객체 간의 관계를 명확히 정의하여 응집성을 높일 수 있다.

  • 연관관계의 주인을 기준으로 객체 간의 연결이 이루어지며, 이를 통해 엔티티 간의 관계를 보다 명확하게 이해할 수 있다.

  • mappedBy 옵션을 사용하여 양방향 연관관계를 설정하면, 객체 간의 관계가 더욱 명시적으로 표현할 수 있다.

  • 연관관계의 주인의 setter 메서드를 사용하여 테이블 간의 연결이 이루어지므로, 데이터의 일관성을 보장할 수 있다.

  • 새로운 개발자가 코드를 이해하기 쉽고, 테스트 코드 작성이 용이해진다.

    주의사항

  • 양방향 연관관계를 설정할 때에는 양쪽 엔티티 모두에게 관계를 설정해 주는게 좋다.

  • 연관관계의 주인을 올바르게 설정하지 않으면 데이터 일관성 문제가 발생할 수 있다.

  • 데이터 직렬화 시, 엔티티 간의 순환 참조가 발생할 수 있다.

  • 연관관계를 지나치게 사용하면 성능 저하가 발생할 수 있다.

  • 도메인 간의 복잡한 연결로 인해 시스템을 이해하기 어렵고, 영향도 파악에 어려움이 생겨 시스템의 유지보수가 어려워질 수 있다.

     

    cascade 옵션

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

  • 데이터가 삭제될 때 연결된 데이터까지 한 번에 삭제 된다.

     

    orphanRemoval 옵션

  • orphan(고아): 관계가 끊어진 데이터

  • removal: 제거

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

 

배포(Deploy)

최종 사용자에게 SW를 전달하는 과정

소프트웨어를 서버 같은 전용 컴퓨터에 설치하고 실행시키는 것을 포함한다.

  • AWS(Amazon Web Service)같은 클라우드 서비스를 사용하면, 다양한 사양의 서버를 빌려 사용할 수 있다.

  • 개발 환경에서는 개발자의 로컬 컴퓨터에서 MySQL과 같은 데이터베이스를 사용할 수 있고, 배포 환경에서는 서버에 설치된 MySQL을 사용할 수 있다.

     

     

    Profile

    소프트웨어를 실행할 때 환경에 따라 다른 설정을 적용하고 싶을 때 사용한다.

     

    데이터베이스 설정, 외부 API 키 등의 환경 구성을 다르게 할 수 있다.

     

     

  • 똑같은 서버 코드를 실행시키지만, local 이라는 profile을 입력하면, H2 DB를 사용하고, dev 라는 profile을 입력하면 MySQL DB를 사용하도록 구성할 수 있다.

     

    H2 Database
    - 경량 Database로, 개발 단계에서 많이 사용한다.
    - 디스크가 아닌 메모리에 데이터를 저장할 수 있다.
    - 메모리 모드에서 실행할 경우, 서버를 재시작할 때마다 데이터가 초기화되므로, ddl-auto 옵션을 create로 설정하면 테이블에 대해 신경쓰지 않고 코드에만 집중할 수 있다. 

 

Git

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

  • 버전 관리

    • 파일 변경 이력을 저장하여, 특정 시점의 버전으로 쉽게 돌아갈 수 있다.

  • 브랜치

    • 동일한 소스 코드에서 여러 개발자가 동시에 다른 작업을 할 수 있도록 지원한다.

    • 기능별로 코드를 분리하고, 완성된 기능을 병합할 수 있다.

  • 협업

    • 여러 개발자가 동일한 프로젝트에 동시에 참여할 수 있고, 작업을 병합하는 과정에서 발생할 수 있는 충돌을 관리하고 해결할 수 있다.

       

     

    Github

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

     

    사용 이유

  • 로컬 시스템에 문제가 발생하더라도 온라인 저장소에 코드를 관리할 수 있다.

  • 인터넷이 연결된 어디서나 코드에 접근할 수 있다.

  • 배포 할 때 활용할 수 있다.

    • 코드 관리 뿐만 아니라 Github Actions 같은 툴을 사용하면 변경사항을 자동으로 테스트하고 배포할 수 있다.

       

    명령어

  • git add 파일 이름

    • 지정된 파일을 스테이징 영역(staging area)에 추가하여 Git이 관리하도록 한다.

    • 모든 변경된 파일을 추가하려면 git add . 명령을 사용할 수 있다.

  • git status

    • 현재 워킹 디렉토리의 상태를 표시한다.

    • 어떤 파일이 수정되었거나 스테이징 영역에 추가되었는지, 아직 추적되지 않고 있는 파일이 있는지 확인할 수 있다.

    • 수정된 파일은 빨간색으로, 스테이징 영역에 추가된 파일은 초록색으로 표시된다.

  • git commit -m "메시지"

    • 스테이징 영역에 추가된 변경 사항들을 로컬 저장소에 저장한다.

    • 커밋 메시지는 변경 사항을 설명하는 데 사용된다.

  • git push

    • 로컬 저장소의 커밋을 원격 저장소에 업로드한다.

 

리눅스 명령어

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

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

    • 더 자세한 정보를 확인하려면 ls -l 명령을 사용할 수 있다.

  • cd(change directory): 폴더 안으로 들어가는 명령어

    • 상위 폴더로 이동하려면 cd .. 명령을 사용할 수 있다.

  • pwd(print working directory): 현재 위치 확인하는 명령어

  • rmdir: 특정 폴더(디렉토리) 제거하는 명령어

 

회고

이번 주에는 JPA의 영속성 컨텍스트와 연관관계, 배포, Git/Github, 리눅스에 대해 학습했다.

Git과 Github 같은 경우에는 이전부터 계속 사용해왔기 때문에 개념을 되짚고 넘어가는 데 큰 어려움은 없었다. 그러나 배포는 항상 조금 두렵게 느껴졌는데, 그 이유는 결과만 생각했기 때문이라는 것을 알 수 있었다. 이번 강의를 통해서 결국 하나의 클라우드 서비스일 뿐이고, 정확한 개념과 동작 원리를 이해한다면, 이런 문제들을 해결할 수 있다는 것을 깨달았다. 처음에는 Git, Github도 어려웠지만, 계속 사용하면서 조금씩 익숙해졌던 것 처럼 아직까지 어색한 클라우드 서비스, 리눅스 등 기술들을 지속적으로 학습하고 사용해보면서 익숙해지려고 노력해야겠다.

이번 주에는 작성한 미니 프로젝트에 대해 코드 리뷰를 받을 수 있었다. 코드 리뷰를 통해 테스트 코드 작성 시 다양한 기법을 고려하고, 로직을 구현할 때 데이터 양과 쿼리 수 등을 고려하는 것이 중요하다는 것을 배울 수 있었다.

스터디를 통해 지금까지 알고 있던 내용을 되짚어보고, 이해도를 높일 수 있었다. 또한, 개발자로서 코드를 작성할 때 고려해야 할 부분에 대해 배울 수 있는 시간이었다.

스터디는 이제 마무리되었지만, 배운 내용을 복습하고, 피드백을 바탕으로 미션을 수정할 예정이다. 또한, 미니 프로젝트를 4단계까지 진행하여 배포까지 완료해 봐야겠다.

댓글을 작성해보세요.

채널톡 아이콘