1. Spring Boot @Valid 어노테이션 동작 방식 설명
Spring Boot에서 @Valid는 입력한 데이터의 유효성을 검사하는 데 사용되는데, 컨트롤러의 파라미터에 발리드를 집어넣고, dto를 쓰면 dto, 안쓴다면 엔티티에 적용해서 입력할 데이터에 조건을 걸고 그것이 맞다면 넘어가고 아니면 예외를 내보냅니다
2. JWT와 Accss/Refresh Token의 동작 방식과 특징
JWT (JSON Web Token)
동작 방식: 로그인 시 서버가 JWT를 발급하고, 클라이언트는 이를 로컬 저장소에 저장합니다. 클라이언트가 보호된 리소스에 접근할 때 JWT를 HTTP 헤더에 포함하여 서버에 요청을 보냅니다. 서버는 JWT의 서명을 검증하여 요청을 처리합니다.
특징: 필요한 모든 정보를 자체적으로 포함하여 서버가 별도의 세션 저장소를 유지할 필요가 없고, 서명을 통해 보안이 뛰어납니다.
Access Token
동작 방식: 로그인 시 서버가 Access Token을 발급하고, 클라이언트는 이를 로컬 저장소에 저장합니다. 클라이언트가 보호된 리소스에 접근할 때 Access Token을 HTTP 헤더에 포함하여 서버에 요청을 보냅니다. 서버는 토큰의 유효성을 검증하여 요청을 처리합니다.(jwt와 동일하지만, 이런식으로 넘어갈것)
특징: 짧은 유효 기간으로 인해 보안성이 높습니다.
Refresh Token
동작 방식: Access Token이 만료되었을 때 새로운 Access Token을 발급받기 위해 사용됩니다.
특징: 긴 유효 기간과 재발급이 가능하단 특징을 가지고 있습니다
3. 테이블의 관계를 다대다로 설정 했을 때, 발생할 수 있는 문제
조인 테이블 많이 사용해서 쿼리가 복잡해질 수 있고 중복 데이터나 잘못된 참조가 발생할수 있고 대량의 데이터를 조회하거나 업데이트할때 성능저하가 일어날수 있습니다.
4. 인증과 인가에 대한 정의와 차이점
인증은 사용자가 누구인지 확인하는것이고 인가는 인증된 사용자가 접근할 수 있는 권한을 부여하는 과정입니다
5. Swagger란? 장단점
Swagger는 API를 쉽게 만들고, 문서화하고, 테스트할 수 있게 하는 도구입니다.
장점으론
Swagger는 API를 자동으로 문서화해주고, 테스트도 간단합니다. 그리고 Java뿐만 아니라 다양한 프로그래밍 언어에서도 사용할 수 있습니다.
단점으론
문서화를 위해 코드에 어노테이션을 추가해야 합니다.
6. JPA의 QueryMethod와 QueryDSL 비교
QueryMethod는 간단하고 빠르게 사용할수있고 , 기본 CRUD도 자동으로 제공해주는 대신 복잡한 쿼리 작성이 힘들고 메서드 이름 길어지면 가독성이 떨어지지만,
QueryDSL 는 복잡한 쿼리와 동적 쿼리 작성 용이한 대신 자동화 같은게 없어서 초기 설정이 힘듭니다.
7. OAuth 란?
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 등에 로그인 할수 있게 하는 서비스 입니다.
장점으론
비밀번호를 공유하지 않으므로 보안이 강하고 여러 서비스에서 동일한 인증 방식을 사용할 수 있어 편리하고 다양한 서비스와 쉽게 통합할 수 있습니다.
단점으론
초기 설정이 복잡하고 외부 인증 서버에 의존하게 됩니다.
8. Bean과 IoC란?
Spring 컨테이너가 관리하는 자바 객체를 빈이라고 하는데, 빈은 의존성 주입을 통해 필요한 의존성을 주입받습니다.
제어의 역전은 객체의 생성 및 제어권을 개발자가 아닌 스프링 컨테이너가 담당하는 것을 의미합니다
IoC를 통해 객체 간의 결합도를 낮추고, 유연하고 확장 가능한 애플리케이션을 개발할 수 있습니다. IoC는 주로 의존성 주입(DI) 패턴을 통해 구현됩니다.
9. ORM이란 무엇일까?
ORM은 객체-관계 매핑을 의미합니다. 객체 지향 프로그래밍 언어를 사용하여 애플리케이션의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑하는 기술입니다
10. N+1 문제의 원인과 해결 방법
특정 객체를 조회할 때, 해당 객체와 연관된 다른 객체들을 추가로 조회하면서 발생하는 문제입니다. 예를 들어, 하나의 쿼리로 3개의 엔티티를 조회할 때, 3개의 쿼리가 실행되는 상황으로 지연로딩에서도 발생하는 문제입니다
해결방법으론
연관된 엔티티를 한 번의 쿼리로 함께 조회 하는 페치 조인, 특정 엔티티를 조회할 때 어떤 연관 엔티티를 함께 로딩할지 선택할수있는 EntityGraph이 있습니다 .
11. 지연로딩과 즉시로딩의 차이점
지연로딩은 관계가 있는 엔티티를 실제로 사용할 때까지 로딩을 지연시키는데, 필요할 때만 데이터를 로딩하므로, 불필요한 데이터 로딩을 방지하고 성능을 최적화하는데, Lazy Initialization Exception오류가 발생할수 있습니다
즉시 로딩 (Eager Loading)
정의: 관계가 있는 엔티티를 처음 엔티티를 로딩할 때 함께 로딩하는데 필요하지 않은 데이터까지 불필요하게 로딩해서 성능이 저하될수있습니다
12. 트랜잭션이란?
트랜잭션(Transaction)은 데이터베이스의 상태를 변환하기 위한 작업으로 데이더베이스의 일관성과 무결성을 유지하는 역할을하는데, 그걸 acid라고 부릅니다
13. 트랜잭션의 ACID특징이란?
원자성 (Atomicity): 트랜잭션 내의 모든 작업이 모두 성공하거나 모두 실패해야 합니다.
일관성 (Consistency): 트랜잭션이 성공적으로 완료되면 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
독립성 (Isolation): 동시에 실행되는 트랜잭션들은 서로 간섭하지 않아야 합니다. 하나의 트랜잭션이 완료되기 전까지 다른 트랜잭션이 그 결과를 볼 수 없습니다.
영속성 (Durability): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에 반영되어야 합니다.
14. filter vs Intercepter vs AOP란
filter, Intercepter, AOP 셋다 인증, 인가, 로깅에 쓰이지만
필터는 서블릿 컨테이너 레벨에서 동작하며, 클라이언트의 요청이 있을때 바로 처리하고
인터셉터는 Spring MVC 레벨에서 동작하며, 컨트롤러에 도달하기 전후라 필터보다 나중에 처리하고
AOP는 특정 작업을 수행할 때마다 같이 실행되서 보조합니다. 예를 들어, 모든 메서드 호출 전에 로그를 남기거나 할때 사용됩니다
15. 가장 자신 있는 자료구조에 대해서 하나 설명 해주세요.
16. Spring과 Spring Boot의 차이점 -> 왜 Spring Boot가 더 좋은가?
스프링은 의존성 주입을 수동으로 하지만 스프링부트는 자동이라서 간단합니다 그래서 일반적으론 스프링부트가 빠르고 간편해서 더 좋습니다
17. RDB와 NoSQL에 대한 정의와 차이점
RDBMS는 관계형 데이터베이스라 부르고 고정된 행(row)과 열(column)로 구성된 테이블에 데이터를 저장하고, acid를 사용합니다
NoSQL은 비관계형 데이터베이스로 관계형 데이터베이스를 제외한 나머지 유형을 말하고 acid도 지원되지 않을수 있습니다
RDBMS 는 행과 열로 저장하지만 NoSQL은 문서, 그래프 등 다양한걸 이용하고'
RDBMS 는 정적 스키마지만 NoSQL은 유연하고 가변적이며
RDBMS 는 데이터 일관성이 중요한 경우에 쓰지만 NoSQL은 대규모, 비정형 데이터에 쓰입니다
18. DispatcherServlet이란? -> Spring Boot가 Request를 받아서 처리하는 일련의 과정을 설명
DispatcherServlet은 클라이언트로부터 들어오는 모든 HTTP 요청을 적절한 컨트롤러로 보내주고 응답을 생성하는 프론트 컨트롤러 입니다
Spring Boot가 Request를 받아서 처리하는 일련의 과정은
요청 수신: 클라이언트가 HTTP 요청을 보내면,
DispatcherServlet 호출: 서버는 요청을 DispatcherServlet으로 전달합니다.
HandlerMapping 조회: DispatcherServlet은 요청 에 맞는 컨트롤러를 찾기 위해 HandlerMapping을 조회합니다
.
컨트롤러 실행: 적절한 컨트롤러를 찾으면
ModelAndView 반환: 컨트롤러는 ModelAndView 객체에 결과를 반환합니다.
ViewResolver 조회: DispatcherServlet은 ViewResolver를 사용해 뷰를 찾습니다.
뷰 렌더링: 최종적으로 뷰를 렌더링하여 클라이언트에게 응답을 반환합니다.
19. @Controller vs @RestController의 차이점
Controller 는 웹페이지를 렌더링해서 화면을 보여주고
RestController는 데이터를 반환합니다
20. Java 소스가 JVM에 올라가서 실행되는 과정을 설명해주세요.
개발자가 Java 소스 파일(.java)을 작성하면
Java 컴파일러(javac)가 소스 파일을 바이트코드(.class 파일)로 변환하고
JVM의 클래스 로더가 바이트코드(.class 파일)를 메모리에 로드하고
로드된 바이트코드가 유효한지 검증합니다. 이 과정에서 파일 형식과 악성 코드 여부도 검사합니다
검사가 끝나면 메모리 영역(힙, 스택, 메서드 영역 등)을 초기화하고, 기본 클래스를 로드합니다
그 다음JVM은 main 메서드를 호출하여 프로그램을 실행하고
프로그램이 종료되면 JVM도 종료됩니다