[개념스터디] 4주차
개념 스터디

[개념스터디] 4주차

ORM

 

대표적인 ERD 관계

 
 

당근 마켓 ERD 예시 비밀번호: 510000
본 ERD 쿼리는 직접 만들었으며, 불완전한 쿼리라 오류 및 수정 사항이 존재합니다.
또한 실제 당근 마켓 쿼리와는 무관합니다!

 

One-to-One

두 엔티티가 1대 1로 대응하는 관계

당근 마켓을 예로 들면,

적절한 예시는 아니지만 거래 완료된 물건이 접시나 인형처럼 여러 개가 아닌, 탁자나 선풍기처럼 1개라는 조건으로

1명의 소유자는 1개의 물건을 갖고,

1개의 물건은 1명의 소유자를 갖으므로 One-to-One 관계를 갖습니다.

 

One-to-Many

두 엔티티가 1대 N으로 대응하는 관계

당근 마켓을 예로 들면,

한 명의 유저는 여러 상품을 업로드하여 판매할 수 있고,

한 개의 상품은 1명의 유저로 인해 판매되므로 One-to-Many 관계를 갖습니다. 

 

Many-to-Many

두 엔티티가 M대 N으로 대응하는 관계

다시 당근 마켓으로 예를 들면,

한 명의 유저는 여러 지역에서 활동할 수 있고,

한 지역은 여러 유저가 활동 가능하므로 Many-to-Many 관계를 갖습니다.

 

N+1 문제

1대 N 관계 구조에서 쿼리 1번으로 N건을 가져왔는데, 쿼리가 N번 실행되는 문제 현상

→ 보통 eager loading 등의 방법으로 해결됨!

eager loading

  • 로딩시 참조해야 하는 정보를 미리 명시하는 일
  • 보통 Join을 이용하여 해결
  • eager loading을 이용하면 N번 실행될 것이 1번만 실행되므로 훨씬 효율적으로 해결됨

 

간단하게 짜본 N+1 오류가 발생하는 코드
N+1 오류. regionId: 777777 게시글이 N번 반복되어, 출력 결과가 140줄 이상 출력됨
Join을 적용하여 N+1 오류를 해결한 코드
정상적으로 해결한 모습. N+1 상황에선 140줄 이상이었지만, 정상적인 출력 결과로 20줄만 출력된 모습

 

객체 지향이란?

객체 지향 프로그래밍은 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체 지향 프로그래밍은 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 Bottom-Up 방식을 이용한다.

추상화

공통의 속성이나 기능을 묶고 이름을 붙여서 불필요한 정보를 숨기거나 중요한 정보만을 표현하는 것

장점

  • 코드 재사용이 용이
  • 유지 보수가 쉬움
  • 대형 프로젝트에 적합

 

리팩터링이란?

리팩터링(refactoring)은 결과의 변경 없이 코드의 구조를 재조정하는 것을 이야기한다.

특징

  • 코드의 구조를 재조정하여 가독성을 높이고 유지 보수를 편하게 함
  • 기본 논리 단순화
  • 복잡성 제거 및 버그나 취약성 해결에 도움
  • 소프트웨어의 기능 보존

방법

  • 중복 코드 추출
  • 장황한 메소드 축소 또는 별도의 메소드로 추출
  • 방대한 클래스 축소 또는 별도의 클래스로 추출
  • 매개 변수들을 객체 통째로 전달 또는 메소드로 전환하여 전달

 

테스트 코드

말 그대로 프로그램을 작성하고 문제가 없는지 확인하는 코드

테스트 코드를 작성하는 이유

  • 빠른 피드백
  • 실시간 자동 검증 가능
  • 개발자가 만든 기능 보호
  • 디버깅 시간 투자 감소
  • 테스트 코드를 통해 다른 개발자들이 코드의 동작을 더 쉽게 이해(주석의 역할과 비슷)

TDD

반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하며 구현한다. 프로그래밍의 의사결정과 피드백 사이의 간극을 의식하고 이를 제어하는 테스트 코드 분석 기술

 

TDD 개발 주기

<Red>단계에서는 실패하는 테스트 코드를 먼저 작성한다. 
<Green>단계에서는 테스트 코드를 성공시키기 위한 실제 코드를 작성한다. 
<Yellow>단계에서는 중복 코드 제거, 일반화 등의 리팩토링을 수행한다.

장점

  • 코드 재사용 보장
  • 의존성이 낮은 모듈로 소프트웨어 개발 가능
  • 튼튼한 객체 지향 코드 생산
  • 재설계 시간 단축
  • 디버깅 시간 단축
  • 추가 구현의 용이함

 

관련글