[면접] Spring 및 백엔드 질문리스트

손성우·2022년 10월 11일
17

면접

목록 보기
1/1

1. JPA는 무엇인가

자바 진영의 ORM(객체와 관계형 데이터베이스를 매핑하는 것) 기술 표준으로 사용하는 인터페이스
JPA가 개발자 대신 SQL을 자동으로 생성하고 객체를 매핑해줌으로써 객체지향적으로 개발을 할 수 있게 도와준다. 그리고 객체지향 프로그래밍은 클래스를 사용하고 RDBMS는 테이블을 사용하는데 이 모델 간에 불일치가 존재하는데, 이런 패러다임 불일치를 해결해준다.

2. Spring Framework와 Spring Boot의 차이

1) Tomcat을 내장하고 있어 따로 설치하고 관리할 필요가 없고 jar file로 간단하게 배포 가능
2) spring boot start(특정 목적을 달성하기 위한 의존성 그룹)를 통해 의존성 자동화 해서 일일히 관리하지 않아도 된다
3) @AutoConfiguration을 통한 자동 설정 및 빈 등록

3. Spring Web MVC의 Dispatcher Servlet 동작원리

모든 요청을 먼저 받는 프론트 컨트롤러. 요청이 들어오면 해당 요청을 매핑한 컨트롤러에 요청을 전달한다. 그 후 처리된 결과를 다시 클라이언트에 반환한다.

4. Spring Bean Life Cycle에 대한 설명

Bean의 생성부터 소멸까지의 과정을 뜻하는데, 스프링 빈은 아래와 같은 라이프 사이클을 가진다.
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료.
간단하게 정리를 하자면, 객체 생성후 의존관계 주입이 끝난 뒤 초기화 콜백을 받은 후 초기화를 한 후 소멸전 콜백을 받아 소멸이 된다.

5. filter와 interceptor의 차이

실행되는 시점이 다르다. 필터는 디스페쳐서블릿 이전에 실행이되는, 웹 어플리케이션 영역이고 인터셉터는 디스패처 서블릿 이후에 실행되는 스프링 영역이다. 필터는 주로 인코딩, 공통 보안 등 요청에 대한 처리를 담당하고 인터셉터는 세부적인 보안 및 인증 작업이나 로깅, 컨트롤러에 넘겨주는 데이터 가공에 사용된다.

6. DI 방법(3가지)

1) 생성자 주입. 한 번 주입되면 변경할 수 없다. 값이 누락된 경우 컴파일 오류가 발생해서 IDE로 어디서 문제가 발생했는지 확인할 수 있는 장점이 있다.
2) setter 주입. public으로 열려 있어서 잘못 건드려서 에러가 발생할 수 있다.
3) 필드 주입. 이름 그래도 필드에 직접 주입하는 방법.

7. AOP로 실제 개발한 경험

로그인 검증을 AOP로 구현한 경험이 있다. 로그인 검증이 필요한 기능마다 로그인 검증 로직이 들어가는 중복되는 코드를 없애기 위해 Custom Annotation을 만들고 검증 필요한 메소드마다 이 어노테이션을 선언해서 중복코드를 제거하고 재사용이 용이하게 했다.

8. maven/gradle의 차이

maven은 xml로 설정하는 반면 gradle은 Groovy(JVM 안에서 작동되는 스크립트 언어)로 구성되어 있어 변수선언, if, else, for 등의 로직이 구현가능하며 간결하게 구성 가능하다.

9. 아파치, 톰캣은 각각 멀티 프로세스인가 멀티 쓰레드인가?

아파치는 정적인 데이터를 처리하는 웹 서버로서 기본적으로 멀티 프로세스(하나의 프로그램을 여러 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 환경)로 구현 되지만 설정에 따라 멀티 쓰레드를 같이 운용할 수 있다. 톰캣은 WAS로서 요청을 처리하기 위한 Thread Pool내 쓰레드를 제공하는, 멀티 쓰레드다.

10. Spring Security 인증은 어떻게 이루어지는가?

사용자가 로그인 정보와 함께 인증 요청(HttpRequest)을 하면 AuthenticationFilter가 요청을 가로채고 가로챈 정보를 통해 UsernamePasswordAuthenticationToken(인증용 객체)를 만들고 이를 이용해 AuthenticationManager의 인증 메서드를 호출한다. 이후 UserDetailsService 구현체를 통해 DB에 저장된 정보와 비교해 일치하면 UserDetails 구현 객체를 반환해 SecurityContext에 저장한다.

11. 객체지향이란?

우리가 실생활에서 쓰는 모든 것을 객체라 하며, 객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다.

12. DI가 뭔지 객체지향관점을 연결지어 말하기

필요한 객체를 직접 생성하는 것이 아닌 외부로부터 필요한 객체를 받아서 사용하는 것.
이로 인해 객체 간의 의존성을 줄이고 재사용을 용이하게 하여 객체지향 프로그래밍의 장점을 살릴 수 있다.

13. IoC 컨테이너의 역할

객체를 생성하고 관리하고 의존성을 관리해주는 컨테이너다. 이 때 컨테이너가 반 설정정보를 바탕으로 자동으로 DI를 해준다.
POJO(Plain Old Java Object, 특정 모델이나 프레임워크를 따르지 않는 순수한 자바 객체)의 생성, 서비스, 소멸 등에 대한 권한을 가진다.

14. JWT(Json Web Token)에 대해 간단히 설명

인증에 필요한 정보들을 토큰에 담아 암호화 시킨 인증 방식.
Header, Payload, Signature로 구성되어있는데, header는 토큰의 타입이나, 어떤 알고리즘이 적용됬는지를 저장하고, Payload는 key-value 형태인 claim으로 개발자가 정한 사용자 정보들을 저장한다. 다만 header와 payload는 암호화가 걸려있지 않기 때문에 민감한 정보는 담지 않는다.
signature는 암호화된 인증 장치로서 서버가 가지고 있는 개인키로만 복호화를 할 수 있고 이를 토대로 jwt가 유효한지를 확인한다.
주요 장점으로는 별도의 인증 저장소가 필수적이지 않고, 클라이언트의 상태를 서버에 저장해두지 않아도 된다.

15. OAuth에 대해 간단히 설명해주세요.

16. JWT와 OAuth의 차이는 무엇이 있을까요?

17. CORS란 무엇이며, CORS 에러를 해결한 경험이 있으면 설명하기

Cross-Origin Resourec Sharing의 약자로, 다른 Origin(출처)으로 요청을 보내기 위해 지켜야 하는 정책이다. 브라우저의 기본 정책인 SOP(Same Origin Policy, 다른 Origin으로 요청을 보낼 수 없도록 금지하는 브라우저의 기본 정책)에 예외를 둘 수 있게 하는 정책인데, 서버에서 allowedOrigin으로 허용한 출처들에 한해서 요청을 할 수 있다.
에러를 해결한 경험으로는 서버에서 헤더로 AccessToken과 RefreshToken을 넘겨주어야 하는 상황이었는데, 클라이언트에서 받지 못하는 상황이었다. 이런 문제가 생긴 이유는 CORS 기본 설정으로는 Content-Type, Content-Language와 같은 기본 헤더들만 접근할 수 있고 그 외 헤더들은 서버에서 설정을 해주어야 했다. 그래서 exposedheaders로 헤더를 추가해주어서 해결하였다.

18. 인스턴스화란 무엇인가?

클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다.

19. 제네릭이란?

타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.
장점으로는 컴파일 단계에서 타입 체크를 할 수 있고, 따로 변환해줄 필요가 없다. 그리고 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다. 제네릭에서 사용되는 타입은 참조 타입만 가능하다.

20. 애너테이션이란?

주석과 비슷한 유형으로서서, 프로그램에 영향을 미치지 않으면서 설정정보나 기능을 제공하는 것.

21. POJO란 무엇인가, Spring Framework에서 POJO는 무엇이 될 수 있을까?

Plain Old Java Object의 약자로서, 특정 자바 모델이나 프레임워크를 따르지 않는 순수한 자바 객체를 말한다. 그리고 이는 스프링에서 도메인과 비즈니스 로직을 수행하는 대상이 된다.

22. RefreshToken을 사용했을 때 보안 이점

AccessToken의 유효기간을 짧게 함으로써, 액세스토큰이 탈취되더라도 그 피해를 최소화 할 수 있다. 그리고 RefreshToken이 없는 공격자는 AccessToken을 발급받을 수 없어 보안 측면에서 좀 더 안전하다.

23. Autowiring 과정

스프링 컨테이너에서 타입을 이용해 빈으로 등록되어 있는지 검색하고 이를 할당해준다.

24. 인터페이스와 추상클래스의 차이점

사용 목적부터가 다른데, 추상 클래스는 그 추상 클래스를 상속받아 기능을 이용하고 확장시키는 것이라면 인터페이스는 각 구현체들이 목적에 맞게 같은 동작을 하는 것이 목적이다.
추상클래스는 단일 상속이고 인터페이스는 다중 상속이 가능하다.

25. RESTFul이란 무엇인지, 아는대로 설명하시오

REST의 원리를 올바르게 지킨 시스템을 의미한다. REST란 Representational State Transfer의 약자로, 자원의 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미한다.
URI를 통해 자원(Resource)을 명시하고 Method(POST, GET, PUT, DELETE, PATCH 등)를 통해
해당 자원(URI)에 대한 CRUD를 적용하는 것을 의미한다. 특징으로는 1) 서버-클라이언트 구조 2) 무상태 3) 캐시 처리 가능이 있다. 설계 규칙으로는 1) 명사와 소문자를 사용 2) 마지막에 슬래시 포함x 3) 언더바 대신 하이폰 사용 4) 파일 확장자는 URI에 포함x 5)updatePost와 같이 행위를 포함x

26. HTTP 메서드와 이것이 하는 역할

클라이언트가 서버에게 요청의 목적이나 종류를 알리는 수단이다. 주요 메소드로는 조회 용도의 GET, 데이터 가공 용도의 POST, 수정은 PUT, 일부만 수정하고 싶은 경우 PATCH, 삭제는 DELETE가 있다.

27. 대용량 트래픽에서 장애가 발생한다면 어떻게 대응할 것인가?

28. 싱글톤 패턴이란?

객체를 한번만 생성하고 메모리에 할당해 호출이 될 때마다 동일한 인스턴스가 반환되는 디자인 패턴이다. 장점으로는, 객체를 한 번만 생성하기 때문에 메모리가 낭비되지 않고, 이미 생성한 인스턴스를 활용하니 속도 측면에서도 이점이 있다. 그리고 전역으로 사용되다보니 데이터를 공유하기 쉽다.

29. TDD를 알고 있나요? TDD에 대해 어떻게 생각하나요?

30. N+1 문제가 발생하는 이유와 이를 해결하는 방법

N+1문제란, 연관 관계가 설정(다대일, 일대다)된 엔티티를 조회할 경우 조회된 데이터 개수 n개 만큼 연관관계의 조회 쿼리가 추가로 발생하는 문제. 발생하는 이유는 JPQL이 연관관계를 무시하고 해당 엔티티를 기준으로만 쿼리를 조회하기 때문에 하위 엔티티가 따로 조회가 된다.
해결 방안으로는 1) Fetch Join을 사용하면 된다. 하지만 이는 페이징 처리가 불가능하다는 단점이 있다. 2) @EntityGraph에 바로 가져올 필으명을 attributePaths에 지정하면 된다. 위 에 두 방법은 카테시안 곱이 발생하여 중복 데이터가 존재할 수 있으므로, 컬렉션을 Set으로 하거나 조회할 떄 distinct를 사용한다. 3) BatchSize

31. String과 StringBuffer 차이

String은 불변이다. 기존 String 객체에 새로운 문자열을 더 할 경우 새로운 메모리 영역이 생성되고 기존 메모리 영역은 Garbage로 남아 사라지게 된다. String은 변하지 않는 문자열을 자주 읽는 경우에 사용하는 것이 좋다.
StringBuffer는 가변성이기 때문에, 동일 객채내에서 문자열을 변경하는 것이 가능하다. 그러기 때문에, 문자열의 추가/수정이 빈번하게 발생하는 경우에 용이하다.

32. MVC란?

애플리케이션의 구성요소를 Model View Controller 세가지 역할로 구분하는 디자인 패턴.
Model은 데이터를 의미합니다. DB와 소통을 하고 필요한 데이터를 컨트롤러에게 전달한다. 뷰와 컨트롤러에 대한 어떠한 정보도 가지고 있지 않는다.
View는 컨트롤러부터 받은 데이터를 사용자에게 전달하는 화면 역할을 한다.
Controller는 사람으로 치면 두뇌를 담당한다. 사용자의 요청을 받아 그 요청에 맞는 데이터를 Model에 의뢰하고, View로 전달하는 역할을 한다. 컨트롤러는 모델이나 뷰에 대한 정보를 갖고 있어야 한다.
비즈니스 로직과 UI로직을 분리하여 유지보수를 독립적으로 수행 가능하고. 구성 요소들 간에 종속되지 않아 확장성에 유리하다.

33. JPA에서 Entity를 설계할 때 주의할 점

  1. 가급적 Setter를 사용하지 않기. Domain은 그 자체로 변경되지 않는다. 어디서 변경이 되는지 추적하기 어려워 유지보수하기 어렵다
  2. 모든 연관관계는 지연로딩 + fetch Join으로 설정하고 추후에 필요한 경우 변경한다.
  3. 컬렉션은 필드에서 바로 초기화 하자. NPE가 발생하지 않고, 하이버네이트에서 엔티티를 영속화할 때, 내장 컬렉션으로 변경하는데 getOrders()처럼 임의의 메소드에서 컬렉션을 잘못 생성하면 내부 메커니즘에서 문제가 발생할 수 있다. 따라서 필드에서 바로 생성하자.

34. 데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요.

35. 트랜잭션이란?

데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위. 그리고 이 작업의 단위는 개발자가 작성하는 SQl에 따라 달라진다. 특징으로는 1) 원자성(DB에 모두 반경되거나 반영되지 않거나)
2) 일관성 (데이터 타입이 전과 후가 항상 동일해야 한다) 3) 독립성 (하나의 트랜잭션은 다른 트랜잭션에 영향을 줄 수 없다.) 4) 지속성(트랜잭션이 성공적으로 완료된다면 영구적으로 결과에 반영된다.) 이는 commit을 통해 보장한다. RollBack은 트랜잭션이 비정상적으로 종료가 되었을 때 변경된 결과를 취소함으로써 원자성을 보장한다.

36. 배열과 링크드 리스트의 차이

배열은 정적인 구조다. 미리 크기를 정해놓아야 하고, 수정이 불가능하다. 하지만 연속된 메모리 주소를 할당받기 때문에 인덱스를 가지게 되서 검색 속도가 O(1)의 시간복잡도를 가져 연결리스트 보다 빠르며 접근, 탐색이 중요하면 배열을 쓰는것이 좋다. 연결 리스트는 동적인 구조다. 크기를 미리 저장할 필요가 없고, 데이터가 추가됨에 따라 크기가 늘어나고 이 데이터들은 노드(값 + 다음 데이터 메모리 주소)를 통해 연결되고 추가 삭제가 용이하다. 검색 속도는 O(n)의 시간복잡도를 가져 배열보다 느리기 때문에 추가, 삭제가 용이하다면 연결리스트가 좋다.

37. JOIN이란?

DB에서 여러 테이블을 결합하여 하나의 열로 나타내는 것을 의미하는데 종류는 크게 이너 조인, 아우터조인, 크로스 조인, 셀프조인이 있다.
이너 조인은 두개의 테이블에서 공통된 요소들을 통해 결합하는 방식이고 아우터조인은 공통된 부분이 없어도 함께 조회하고 싶은 경우에 사용되고 크로스 조인은 특정 기준 없이 두 테이블 간 모든 경우의 수를 다 조회한다. 셀프조인을 자기 스스로를 결합시킬 때 사용됩니다.

38. RDBMS ,NOSQL에 대해 설명

RDBMS는 관계형 데이터베이스 관리 시스템으로서, 구성된 테이블끼리 관계를 맺고 모여있는 집합체이다. 2차원의 테이블 형식으로 속성과 값으로 이루어져 있다. NoSQL은 테이블 간의 관계를 정의하지 않고 key-value로 이루어져있다. 정해진 스키마가 없고 데이터의 입출이 자유로워 대용량 데이터를 저장하는데 용이하다. 쓰임새는 명확한 스키마가 필요하고 데이터 중복을 허용하지 않는 경우 RDBMS를 사용하고, 정확한 데이터 구조가 있지 않고 데이터가 확장이 될 수 있는 경우 NoSql을 사용한다.

39. 오버라이딩, 오버로딩 정의와 차이점

오버라이딩은 상속받은 메소드를 자식 클래스에서 재정의 하는 것을 의미. 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다. 오버로딩은 한 클래스 내에 메소드의 이름이 동일해도 매개변수나 타입이 다르면 여러개를 정의할 수 있는 것을 의미한다.
차이점은 오버라이딩은 접근제어자를 부조 클래스보다 더 넓은 범위만 가능하고 오버로딩은 제한이 없고 적용 범위가 오버라이딩은 상속 관계에서, 오버 로딩은 같은 클래스 내에서 적용된다.

40. 즉시 로딩과 지연 로딩의 차이

즉시로딩은 연관관계에 있는 모든 엔티티를 한 번에 조회하는 것이고
지연 로딩은 연관관계가 있는 엔티티가 실제로 사용욀 때 조회합니다.

41. WAS와 WS의 차이

WAS DB조회, 로직을 처리하는 동적인 컨텐츠를 제공하는 서버고 Tomcat, Jeus가 있다.
WS는 html, css같은 정적인 컨텐츠를 제공하는 서버로서 Apache, Nginx가 있다.
WAS안에 WS가 있지만, 서버의 부담을 줄이기 위해 WAS와 WS를 분리하는 것이 좋습니다.

42. Call By Value와 Call By Reference 차이

46. 메모리에서 힙 vs 스택

profile
백엔드 개발자를 꿈꾸며 공부한 내용을 기록하고 있습니다.

0개의 댓글