본문 바로가기
사이드 프로젝트/개발몰입과정[2021_SUMMER]

4주차 개념 스터디 - BE

by 의정부핵꿀밤 2021. 8. 28.
728x90

인턴 마지막 주차...

원래 공부하면서 보내려고 했는데 마지막까지 잡무 다 시켜서 착즙하는 company...

최악이야...

벌써 과제 2주나 밀렸는데 인턴 떄문이라고 하면 다 변명이겠지,,,

오늘 밤새서 3주차 과제 반은 끝낼거다!

회사에서 할 수 있는 개념스터디 먼저 해두려고!!

 


1. ORM의 One-to-One, Many-to-One, One-to-Many, Many-to-Many 각각 언제 사용할까?

1) One to One (1:1)

- 두 엔티티(entity)가 단 하나의 관계를 갖는 것을 의미한다

- ex) 부부 관계 : 일부일처제, 남편과 부인을 1명씩밖에 둘 수 없는 느낌? 즉, 부부 관계는 일대일로만 가능하다!

 

 

2) Many to One (N:1) && One to Many (1:N)

- 두 엔티티 중 하나의 엔티티에서만 여러 관계를 갖는 것을 의미한다

- ex) 일반적인 부모-자식 관계에서는 부모 한 쌍에 자식을 여러 명 가질 수 있다. 이 때 부모:자식 = 1:N 관계이다

 

3) Many to Many (N:M)

- 두 엔티티 모두 서로 여러 관계를 갖는 것을 의미한다

- ex) 학원과 학생 관계는 다대다 관계이다 : 한 학원에 여러 학생이 수강할 수 있고, 반대로 학생도 여러 학원에 등록 가능하니까!

 

 

2. ORM의 N+1 문제란?

ORM의 N+1 문제

연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 되는데, 이를 N+1문제라고 한다.

 

예시는 이 블로그에서 보면서 이해하면 될듯!

지금은 ORM이랑 낯가리는 중이라 나중에 직접 해보고 다시 글 써야겠다!!

 

발생 원인

jpaRepository에 정의한 인터페이스 메서드를 실행하면 JPA는 메서드 이름을 분석해서 JPQL을 생성하여 실행하게 된다. JPQL은 SQL을 추상화한 객체지향 쿼리 언어로서, 특정 SQL에 종속되지 않고 엔티티 객체와 필드 이름을 가지고 쿼리를 한다. 그렇기 때문에 JPQL은 findAll()이란 메소드를 수행하였을 때 해당 엔티티를 조회하는 "select * from 테이블" 쿼리만 실행하는 것이다. JPQL 입장에서는 연관관계 데이터를 무시하고 해당 엔티티 기준으로 쿼리를 조회하기 때문이다. 그렇기 때문에 연관된 엔티티 데이터가 필요한 경우, FetchType으로 지정한 시점에 조회를 별도로 호출하게 된다.

 

결론

 

  • N+1은 JPA를 사용하면서 연관관계를 맺는 엔티티를 사용한다면 한번 쯤은 부딪힐 수 있는 문제이다.
  • Fetch Join이나 EntityGraph를 사용한다면 Join문을 이용하여 하나의 쿼리로 해결할 수 있지만 중복 데이터 관리가 필요하고 FetchType을 어떻게 사용할지에 따라 달라질 수 있다.
  • SUBSELECT는 두번의 쿼리로 실행되지만 FethType을 EAGER로 설정해두어야 한다는 단점이 있다.
  • BatchSize는 연관관계의 데이터 사이즈를 정확하게 알 수 있다면 최적화할 수 있는 size를 구할 수 있겠지만 사실상 연관 관계 데이터의 최적화 데이터 사이즈를 알기는 쉽지 않다.
  • JPA 만으로는 실제 비즈니스 로직을 모두 구현하기 부족할 수 있다. JPA는 만능이 아니다. 간단한 구현은 JPA를 사용하여 프로젝트의 퍼포먼스를 향상 시킬수 있겠지만 다양한 비즈니스 로직을 복잡한 쿼리를 통해서 구현하다보면 다양한 난관에 부딪힐 수 있다. 그리고 불필요한 쿼리도 항상 조심해야 한다. 그러므로 QueryBuilder를 함께 사용하는 것을 추천한다. 그러면 생각보다 다양한 이슈를 큰 고민없이 바로 해결할 수 있다.

 

※ 참고) 자바 ORM 표준 JPA 프로그래밍 책은 도서관에 빌려다 읽어 볼 예정이다ㅎㅎ

 

3. 객체지향은 무엇이며 어떤 장점이 있길래 사용하는걸까?

객체 지향 프로그래밍이란? (OOP)

프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다!

 

장점

  • 코드 재사용이 용이하다 : 남이 만든 클래스를 가져와서 이용할 수 있고, 상속을 통해 확장해서 사용이 가능하다
  • 유지보수가 쉽다 : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야 하는 반면, 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메소드로 있기 때문에 해당 부분만 수정하면된다!
  • 대형 프로젝트에 적합 : 클래스 단위로 모듈화시켜서 개발할 수 있으므로, 대형 프로젝트처럼 많은 사람들이 개발할 때 업무 분담이 쉽다

단점

  • 처리속도가 상대적으로 느리다
  • 객체가 많으면 용량이 커질 수 있다
  • 설계 시 많은 시간과 노력이 필요하다

 

객체 지향 프로그래밍 키워드 5가지

  1. 클래스 + 인스턴스(객체)  : 클래스는 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것이고, 인스턴스(객체)는 클래스에서 정의한 것을 토대로 실제 메모리 상에 할당된 것으로 실제 프로그래밍에서 사용되는 데이터이다
  2. 추상화 : 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다
  3. 캡슐화 : 코드를 재수정없이 재활용하기 위해 기능과 특성의 모음을 "클래스"라는 캡슐에 분류해서 넣는 것이다
  4. 상속 : 부모 클래스의 속성과 기능을 그대로 상속받아 사용하고, 기능의 일부만을 수정해야 할 경우, 상속 받은 자식 클래스에서 해당 기능만 다시 수정하여 사용할 수 있다
  5. 다형성 : 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있다. (오버라이딩, 오버로딩)

 

여기에 면접에도 도움될 만한 내용이 많아보인다!!

출처) https://jeong-pro.tistory.com/95

 

객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)

객체 지향 프로그래밍(Object Oriented Programming) 여러 SW기업 신입사원 기술면접에서 워밍업느낌으로 면접자들 긴장을 풀어줄 겸 처음으로 자주 나오는 질문이다. "객체 지향 프로그래밍에 대해 설

jeong-pro.tistory.com

※ 참고) '객체지향의 사실과 오해' 책도 도서관에 빌려다 읽어 볼 예정이다ㅋㅋ

 

 

4. 리팩터링은 무엇이며 왜 그렇게 중요할까?

리팩터링(Refactoring)이란?

결과의 변경 없이 코드의 구조를 재조정한다는 뜻이다.

코드의 기능이나 결과는 수정하지 않고, 코드의 가독성을 높이고 유지보수를 편하게 하기 위해서 수정하는 것을 의미한다.

 

목표

소프트웨어의 설계, 구조 및 구현을 개선하는 동시에 소프트웨어의 기능을 보존하는 것이다!

사실 되게 귀찮은 작업이지만 추후에 다른 사람들에게 코드를 넘겨주거나 유지보수를 위해 수정할 때 가독성 높은 코드가 좋기 때문에 상당히 중요한 작업이다!

 

 

5. 테스트 코드는 왜 중요하며, TDD란 무엇인가?

테스트 코드란 테스트를 하는 코드이다.

띠용...?

코드에 임시로 출력해보면서 검사할 수 있지만, 이걸 사용하는 이유가 있다!

 

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

  • 빠른 피드백이 있다
  • 자동 검증이 가능하다
  • 개발자가 만든 기능을 안전하게 보호한다

 

TDD란?

Test Driven Development의 약자로, 테스트 주도 개발이라고 한다

반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.

짧은 개발 주기의 반복에 의존하는 개발 프로세스이며 애자일 방법론의 일부인 XP의 'Test-First' 개념에 기반을 둔 단순 설계를 중요시한다.

 

 

TDD 참고) https://wooaoe.tistory.com/33

 

[기술면접] TDD(Test-Driven-Development) 방법론에 대해서

TDD(Test-Driven-Development) 방법론에 대해서 파헤쳐보자! ❓ TDD가 무엇입니까? - TDD란 Test Driven Development의 약자로 '테스트 주도 개발'이라고 한다. 반복 테스트를 이용한 소프트웨어 방법론으로, 작은.

wooaoe.tistory.com

 

728x90

댓글