코딩/sparta TIL

TIL 57 : 베이직 기술 면접 망함 - 죄송합니다. 튜터님 준비를 안하긴 했어요.

americanoallday 2025. 5. 14. 19:20

너무 만만하게 생각하고 갔다가 망했다.

그냥 대답하는거 시뮬이라도 돌려볼 걸, 그냥 개념 검색만 예전에 해보고 단편적인 것만 머리에 담아두고 간게 문제였다.

대답을 시뮬했어야 했다!!!! 😩😩😩😩😩😩😩

 

1. @RestController, @Controller 차이점

 

내 대답:

@RestController는 JSON 응답용, @Controller는 뷰 응답용이다.

 

튜터님:

그럼 @Controller에서 “home”이라는 문자열을 리턴하면 어떤 일이 벌어지나요?

 

당황했다. "home"이라는 단어가 그냥 문자열로 응답으로 보여준다는건가?라고 생각하며 감이 안 잡혔다.

튜터님이 보기로 1) "home"2) home.html을 제시해줘서,

그제야 “아, view resolver가 home.html을 찾아주는 거구나” 하고 이해함.

결국 “뷰 이름으로 해석돼서 home.html을 반환한다”고 수정해서 답변...

 

2. @DI란 무엇이며, Controller-Service-Repository에서 어떻게 작용하는가

 

내 대답:

DI는 의존성 주입이고, 없으면 new로 객체를 일일이 만들어야 한다.

스프링은 어노테이션(@Repository, @Service, @Controller)을 이용해 자동 주입해준다.

 

튜터님:

그 객체들을 어떻게 주입하나요?

 

내 머릿속엔 private final AService aService; 같은 코드가 있었는데,

구체적으로 어떻게 주입이 이루어지는지를 설명 못함.

 

내 대답:

클래스에서 변수를 선언해서.... 주입 합니다...(private final AService aService;) 

 

튜터님:

그걸 어떻게 주입하는지...?

 

내 대답:

혹시 @RequiredArsConstructor말씀 주시는건지...?

 

튜터님: 

맞다. 그럼 어떻게 작동하는가?

 

내 대답:

@ComponentScan이 처음에 컴파일 할 때 한번에 빈을 등록해서 불러온다. 

 

튜터님:

정확히는 SpringContext가 ComponentScan을 이용해 Bean을 등록하는 과정이라고 정정해주심.

 

 

3. Entity, DTO 분리 이유

 

내 대답:

DTO를 사용해서 원하는 정보만 응답하기 위해서 사용합니다.

 

튜터님:

그럼 Entity는 왜 사용하는가?

 

내 대답: 

데이터 테이블과 연결하려고 사용합니다.

 

튜터님:

보안성 이슈도 있지만 다른 문제 때문도 있다. 힌트는 연관관계.

 

내 대답:

잘 모르겠습니다.

 

튜터님이 순환 참조에 대해서 설명해주심(JPA에서 Entity 간 양방향 연관관계는 무분별한 JSON 직렬화를 유발할 수 있기 때문에 DTO로 분리해야 한다)

 

4. @Transactional이란 무엇인가요?

 

내 대답:

(이 때 머리속으로 구조는 알고 있었는데, 말로 나가려니 어버버 거림, 말로 설명이 안됨. 조금 지나서... 이딴식으로 대답함)

롤백하기 위해 쓰는데, 예를 들어 은행 업무같이 송금과 입금이 동시에 처리가 되어야 하는데, 송금만 하고 문제가 발생하면 다시 롤백을 하기 위해 씁니다. 

 

튜터님: 

@Transactional
public void methodA() {
    methodB();
}

@Transactional
public void methodB() { ... }
이런 구조라고 했을 때, methodB에도 트랜잭션이 적용되나요?

 

 

나는 이게 한 클래스 안에 있는건지 인지를 못한 상태였음. 그래서, 적용된다고함. 

 

튜터님:

적용이 안됩니다. 내부 호출입니다.

그럼 다른 클래스라고 했을 때 methodB가 REQUIRES_NEW일 경우 어떻게 되는지

 

내 대답:

B만 실패하고 A는 실패 처리가 안됩니다.

 

튜터님:

그럼 methodB에서 throw new Exception이 발생한다면?

 

내 대답:

(그럼 A도 실패해야 하는데, 난 예외처리된 걸로 오해해서) “A는 괜찮다”고 답함.

 

튜터님:

아니요. A도 실패처리가 됩니다. 예외가 발생한 것과 예외를 *처리한 것(Try-Catch)*은 다르다. 방금 질문은 Try-Catch를 안하고 예외가 발생한 경우였습니다.

 

5. N+1이란, 해결 방법은?

 

내 대답:

Lazy 로딩으로 인해 발생하는 이슈로, 연관관계에 놓인 데이터를 추후에 접근할 때 추가로 N개의 쿼리가 나가기 때문입니다.

 

튜터님:

그럼 Eager는 N+1문제가 발생 안하는가?

 

“그렇다”고 대답했는데, 틀림. (나는 Eager가 바로 fetch join으로 이해하고 있었음...)

 

튜터님:

Eager도 N+1 발생합니다. 매를 먼저 맞느냐(Eager) 나중에 맞느냐(Lazy)차이이다.

그럼 Fetch Join과 그냥 Join의 차이점이 뭔지 아시나요?

 

“죄송합니다”라고 대답했고, 튜터님이 설명해주심.

 

튜터님:

Fetch Join을 하면 1차 캐시에 등록이 되고, Join은 등록을 안하는 것