본문 바로가기

Study

[내일배움캠프 TIL] 2일차 - Spring 심화

728x90
반응형

오늘도 Spring 강의를 들었습니다.

그리고 튜터님과 면담이있었는데, 기술 질문들을 물어보셨고

아는 내용도 머리속에 정리가 안되서 대답을 잘 못해서

개념들을 평소에 정리해놓는게 중요하다는 것을 알게 되었습니다.

 

1. 오늘의 학습 키워드

restTemplate, Lazy, eager, cascade,  DI,  entity 연관관계 (1:1, 1:N, N:M ..)

2. 핵심 키워드 상세 정리

RestTemplate

  • 정의: Spring에서 제공하는 동기(Blocking) 방식의 HTTP 통신 클라이언트입니다.
  • 역할: 내 서버에서 외부 API를 호출할 때 사용하며, JSON 응답을 자바 객체로 자동 변환해 주는 기능을 제공합니다.

Lazy(지연 로딩) & Eager(즉시 로딩)

  • Lazy: 연관된 엔티티를 실제로 사용하는 시점에 DB에서 조회하는 방식입니다. (성능 최적화에 유리)
  • Eager: 엔티티를 조회할 때 연관된 모든 엔티티를 한꺼번에 조회하는 방식입니다.

Cascade(영속성 전이)

  • 정의: 부모 엔티티의 상태 변화(저장, 삭제 등)를 자식 엔티티에 전파하는 설정입니다.
  • 특징: CascadeType.ALL을 사용하면 부모만 저장해도 연관된 자식들이 자동으로 DB에 반영되어 편리합니다.

DI (Dependency Injection, 의존성 주입)

  • 정의: 객체가 직접 의존 객체를 생성하지 않고, 외부(Spring 컨테이너)로부터 주입받는 디자인 패턴입니다.
  • 장점: 객체 간의 결합도를 낮추고 유연성과 테스트 용이성을 높여줍니다.

Entity 연관관계 (1:1, 1:N, N:M)

  • 1:1 (OneToOne): 한 명의 사용자가 하나의 프로필을 가지는 관계입니다.
  • 1:N (OneToMany): 한 명의 사용자가 여러 개의 게시글을 작성하는 관계입니다. (실무에서 가장 흔함)
  • N:M (ManyToMany): 여러 학생이 여러 강의를 수강하는 관계입니다. 중간 테이블이 필요하며 관리가 까다로워 실무에서는 1:N - N:1로 풀어서 사용하곤 합니다.

3. 질문 정리

Q. JS에서 호이스팅(Hoisting)이란?

  • A: 변수나 함수 선언문이 해당 스코프의 최상단으로 끌어올려진 것처럼 동작하는 현상입니다. var로 선언한 변수는 선언 전 호출 시 undefined가 나오지만, let과 const는 TDZ(Temporal Dead Zone) 영향으로 에러가 발생해 더 안전합니다.

Q. 순환 참조란?

  • A: 두 개 이상의 객체가 서로를 참조하고 있어 끝이 나지 않는 루프에 빠지는 현상입니다. 특히 JPA 양방향 연관관계에서 JSON 변환 시 무한 루프가 발생할 수 있어 @JsonIgnore 등으로 끊어주어야 합니다.

Q. 객체를 추상화하면 개발(재사용)하는데 좋은 이유?

  • A: 구체적인 구현(How)을 숨기고 공통된 규격(Interface)을 정의하기 때문입니다. 덕분에 내부 로직이 바뀌거나 새로운 부품이 추가되어도 메인 코드를 수정하지 않고 그대로 재사용할 수 있어 유연한 확장이 가능합니다.

Q. 의존성 주입(DI)이란?

  • A: 객체가 사용할 협력 객체를 직접 만들지 않고 스프링이 '주입'해주는 것입니다. 비유하자면 요리사가 칼을 직접 대장간에서 만들지 않고, 주방장이 주는 칼을 받아 사용하는 것과 같아 요리사는 요리에만 집중할 수 있게 됩니다.

Q. N + 1 문제? 해결 어떻게?

  • A: 1번의 쿼리로 N개의 데이터를 가져왔는데, 연관 데이터를 조회하기 위해 N번의 추가 쿼리가 발생하는 성능 문제입니다. (질문하신 N+M은 보통 N+1을 의미합니다.)
  • 해결 방법: 주로 Fetch Join을 사용해 한 번의 쿼리로 연관된 데이터를 미리 다 가져오거나, Batch Size 설정을 통해 쿼리 횟수를 획기적으로 줄여 해결합니다.
반응형