Java/공부

백엔드 개발자 자바, 스프링 질문 완전정복

Frankie 2022. 9. 12. 22:45

중점

- 얼마나 진정성을 가지고 개발자를 준비해왔는가, 본인 스스로 노력한 게 있는가? (토이 프로젝트, 블로그 정리 등)

- 프로젝트 끝나고도 계속해서 프로젝트를 개선하고 출시

- 단순히 개념 뿐만 아니라 작동 방식이나 구현 방법에 대해서도 알아두자

 

1. 다른 언어/프레임워크(GraphQL -> REST API와 다른 점, Node.js -> Spring Boot와 차이점)

 

REST API

장점 - HTTP 캐싱 잘 사용 가능, 파일 전송 등 단순한 텍스트로 처리되지 않는 요청들이 있을 때, 요청의 구조가 정해져 있을 때

 

GraphQL

장점 - 다양한 요청들에 대해 응답할 수 있어야 할 때(엔드포인트 하나), 오버페칭(요구사항보다 많은 데이터 반환하는 경우) 해결

단점 - 고정된 요청과 응답만 필요한 경우 쿼리로 인해 요청의 크기가 RestFul API보다 커진다. 재귀적인 쿼리가 불가능.

 

Node.js

장점 - 비동기 방식(다른 작업 처리 중에 다른 작업 가능). 하나의 쓰레드를 이용해 메모리 크게 잡아먹지 않음.

단점 - TypeSafe하지 않음(별것도 아닌 에러로 런타임에 죽을 수 있음). IDE에서 자동 완성 잘 안됨(리팩토링하거나 기존 코드 재사용할 때 불편)

 

Spring Boot

장점 - TypeSafe(리팩토링이나 확장에 용이). 멀티 쓰레드 지원해서 반복적인 업무 처리할 때 효율적.

 

단점 - 러닝 커브 존재. 내부적으로 메모리를 많이 사용.

 

2. 자바 기본 메서드(equals(), hashCode())

 

equals() - 객체의 값 비교 <-> ==는 주소값을 비교

 

String a = new String("abc");

String b = new String("abc");

 

a == b // false -> 주소값을 비교

a.equals(b) // true -> 값을 비교

 

hashCode() - 두 객체가 같은 객체인지 확인

 

-> 동일한 객체는 동일한 메모리 주소를 갖는다는 것을 의미하므로, 동일한 객체는 동일한 해시코드를 가져야 한다. 그렇기 때문에 equals() 메소드를 오버라이드 하면, hashCode() 메소드도 오버라이드 되어야 한다.

 

3. 제네릭

클래스나 메소드 선언 시 컴파일 과정에서 타입체크를 할 수 있다.

 

사용 이유

- 컴파일 단계에서 에러 검출

- 타입 캐스팅을 컴파일러가 해줌(캐스팅 필요 x)

- 재사용성이 좋아짐.(오버로딩 할 필요 없이 코드를 줄일 수 있다)

 

4. RDBMS 인덱스(Balanced-Tree)

 

해시는 하나의 데이터를 탐색

RebBlack-Tree 하나의 노드에 하나의 데이터만

Balanced-Tree 하나의 노드에 여러개 데이터

 

메모리 확보. 따라서 하나의 node 많은 포인터를 가질 있기 때문에 트리의 높이가 낮아지므로 검색 속도 up

 

5. 로그인 기능, HttpSession클래스

 

HttpSession.getAttribute("user")

 

사용자 AB로 접속해도 'user'를 키 값을 가져오는데 어떻게 AB 구분?

 

보통 DB 같은 경우 Query 파라미터가 계속 바뀌며 전송되서 다른 값들을 구분하는데, 세션은 코드가 이미 'user'등으로 fix된 상태에서 사용자를 구분

 

세션은 쿠키를 기반 ( 쿠키는 브라우저(클라이언트)에 저장, 세션은 쿠키를 기반하지만 정보를 서버에서 관리 )

 

세션 사용방식

1. @Autowired로 주입

2. 메소드의 매개변수로 주입

 

JSESSIONID(톰캣 컨테이너가 세션을 유지하기 위해 클라이언트에게 발급해주는 키) 값을 이용해서 사용자를 구분.

 

클라이언트가 처음 서버 접속 시, 서버는 클라이언트에게 Response Header안 쿠키에 JSESSION ID값을 담아 응답.

 

그럼 클라이언트는 응답받은 쿠키를 가지고 그 다음 요청시 마다 Requset Header에 이 쿠키를 포함해서 서버에 요청.

 

서버는 클라이언트의 Request Header에 포함된 JSESSION ID값을 통해 JSESSION ID와 매핑되는 Session을 연결해주어 상태도 유지하고 사용자도 구분

 

6. Shell Script(return)

 

쉘 스크립트의 return 문은 다른 프로그래밍 언어의 return문과 어떤 차이점?

 

EXIT_STATUS로 전달되면 $?로 확인 0은 성공, 1~255 에러 -> echo로 전달, 전역변수 공유

 

-> 문자열 return numeric argument required라는 에러 메시지 출력(2)

 

7. JPA N+1, fetch join

 

1:N 관계의 테이블을 실제로 Join 쿼리를 이용하면 어떻게 되나요?

예를 들어 부모테이블이 1, 자식테이블이 10건이 있을때 Join 쿼리를 날리면 몇 건이 조회?

 

1+10 = 11

 

n+1 경험: 연관 관계가 설정된 엔티티 조회할 경우에 조회된 데이터 갯수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터 읽어오는 현상

 

- 여러 유저

 

Fetch 모드 Eager인 경우 - 연관관계에 대한 추가적인 Lazy 로딩이 진행되어 N+1 문제 발생

Fetch 모드 Lazy인 경우 - 유저를 사용하려고 하면 N+1 문제 발생

 

발생 이유: JPAJPQL을 분석해서 SQL 생성할 때는 Fetch 모드를 참고하지 않고 오직 JPQL 자체만을 사용.

 

1) Fetch Join : DB에서 데이터를 가져올 때 처음부터 연관된 데이터까지 같이 가져오게 하는 방법(SQL JOIN문 생각) -> 별도의 메소드 만들어줘야 하며 @Query 어노테이션을 사용해서 join fetch 구문을 사용하면 된다. 하위 엔티티까지 한번에 가져올 수 있다. (fetch 키워드를 사용하게 되면 연관된 엔티티나 컬렉션을 한 번에 같이 조회 가능)

 

2) Batch Size(권장x) : N+1 문제가 발생하더라도 select * from user where team_id in (?,?,?) 방식으로 N+1 문제가 발생하게 하는 방법. 이렇게 하면 100번 일어날 N+1 문제를 1번만 더 조회하는 방식으로 성능을 최적화.

 

problem) 컬렉션을 페치 조인하면 일대다 조인이 발생하므로 데이터가 예측할 수 없이 증가.

 

페이징 + 컬렉션 엔티티 함께 조회하려면?

 

ToOne관계 모두 페치조인 -> row수 증가시키지 않으므로 페이징 쿼리에 영향 x

 

컬렉션은 지연 로딩으로 조회 -> 지연 로딩 성능 최적화를 위해 @BatchSize를 적용(컬렉션이나, 프록시 객체를 한꺼번에 설정한 size만큼 IN 쿼리로 조회)

 

8. 최근에 읽어봤던 가장 인상 깊었던 기술책, 기사, 공식 문서(ex. effective java)

어떤 내용이 제일 인상깊었는지 or 책에서 제일 인용되는 것들이나 가장 쉬운 챕터에 대한 내용에 대해 질문

 

ex. Reference type Primitive type의 차이가 무엇인지?

 

9. 프로세스 쓰레드 설명

 

프로세스 - os로부터 자원을 할당받는 작업의 단위

 

쓰레드 - 프로세스가 할당받은 자원을 이용하는 실행 단위

 

 

 

10. post방식과 get방식

 

두 방식 모두, 서버에 요청을 하는 메서드

 

get방식 - URLParameter를 붙여서 전송. -> 결과값이 바뀌지 않는 유형의 메서드

 

post방식 - body영역에 데이터를 실어서 전송.(body영역 데이터 타입을 Header Content-Type에 명시 해줘야함) -> 결과값이 바뀌는 유형의 메서드

 

둘 다 데이터는 전부 클라이언트측에서 볼 수 있다. -> 두 방식 모두 암호화해야한다.

get방식이 post방식보다 빠름. -> get방식은 캐싱이 가능하고, post방식은 불가능

 

11. Bean의 생명주기 - 스프링 컨테이너 초기화, 종료

 

12. static 역할 : static에 선언된 자원들은 JVM에서 메모리에 딱 한 번 올라감. 고정 메모리. 단점 - 무분별한 사용은 메모리 낭비

 

13. JVM : 자바 컴파일러가 자바 파일을 컴파일하면 운영체제가 이해할 수 있도록 해석 (운영체제 상관없이 같은 코드 사용 가능)

 

14. 객체 생성 방법 - new 연산자 사용

 

15. DAO, DTO, VO

- DAO : DB에 접근하여 실제 데이터 조작하는 클래스

- DTO : 데이터를 주고 받기 위해 사용

- VO : 실제 데이터만을 저장

 

16. Servlet: 동적 웹페이지를 만들 때 사용되는 자바 프로그래밍 기술

 

17. Servlet 컨테이너: 클라이언트 요청을 받고 응답할 수 있도록 웹 서버(톰캣)와 소켓으로 통신

 

18. Dispatcher Servlet: 클라이언트 요청을 먼저 받는 서블릿, 요청에 맞는 컨트롤러에게 전달

 

19. Spring MVC 작동 원리

클라이언트가 요청 전송

디스패처서블릿이 요청에 맞는 컨트롤러에 전달

컨트롤러 처리 뷰의 이름 반환

디스패처서블릿이 컨트롤러에게 뷰에 전달한 데이터 추가

데이터가 추가된 반환

 

20. IOC: 제어의 흐름이 프레임워크에 있다. 객체의 생성부터 모든 생명주기의 관리까지 프레임워크가 주도. @Autowired Bean 주입하는 . IOC 컨테이너 DI 통해 주입.

 

21. DI: 객체를 직접 생성하는 아니라 외부에서 생성한 주입. 모듈 간의 결합도가 낮아지고 유연성이 높아진다. 생성자를 통해 주입. @Autowired 어노테이션, Setter

 

22. Interceptor: 스프링이 제공. 디스패처서블릿이 컨트롤러를 호출하기 전과 요청을 가로채서 처리.

 

23. -Filter: 디스패처서블릿에 요청 / 부가적인 작업을 처리, @WebFilter

 

24. JPA N+1, fetch Join

 

1:N 관계의 테이블을 실제로 Join 쿼리를 이용하면 어떻게 되나요? 예를 들어 부모테이블이 1, 자식테이블이 10건이 있을때 Join 쿼리를 날리면 건이 조회?

 

1+10 = 11

 

- Fetch Join : DB에서 데이터를 가져올 처음부터 연관된 데이터까지 같이 가져오게 하는 방법(SQL JOIN 생각) -> 별도의 메소드 만들어줘야 하며 @Query 어노테이션을 사용해서 join fetch 구문을 사용하면 된다. 하위 엔티티까지 한번에 가져올 있다.

 

프론트엔드 질문

 

1. 단방향 & 양방향 바운딩(프론트엔드 인터뷰 구글에 검색 -> 면접 준비 했는지)

 

2. 로그인 페이지 구현

 

아이디, 비밀번호를 서버로 전송해서 체크해서 세션, 쿠키 쿵짝쿵짝하는 것에 대해 얘기

http 헤더, json body 이런 얘기

쿠기가 http 어느 파트에 있었는지?

 

3. 네트워크 예외 처리 어떻게 했는지?

status code, try catch, axios의 공통적인 에러 처리 방법

 

헤더와 바디에 대한 구분

 

헤더 - 요청에 대한 정보

바디 - 요청할 함께 보낼 데이터를 담는 부분

 

4. 장애상황 대처

- 페이지 만들어서 접속했을 , 화면이 확인할 있는 포인트

- 페이지가 느릴 확인할 있는 포인트

- js 다운로드가 느릴 확인하고 해결할 있는 포인트

 

-> pc 인터넷 상태 확인, 네이버 들어가서 확인, 크롬의 개발자 도구를 이용해서 확인

'Java > 공부' 카테고리의 다른 글

자바 공부  (0) 2022.09.12
[디자인 패턴] 팩토리 메소드 패턴  (0) 2022.06.16
SpringBoot 구조 정리  (0) 2022.04.04