Join은 무엇인가요?
Join은 여러 테이블의 데이터를 결합하기 위한 개념입니다. 공유 field를 기반으로 서로 다른 테이블에서 관련 정보를 검색할 수 있습니다. 다음과 같은 데이터베이스가 있다고 가정합시다:
- 고객 테이블은 이름, ID와 같은 고객 정보를 저장합니다.
- 주문 테이블은 고객 ID(고객 테이블과 연결된)를 포함한 주문 정보를 저장합니다.
완전한 정보를 위해, 고객 정보를 주문 정보와 결합해 보여주길 원할 것입니다. 이때 조인을 사용합니다.
조인에는 여러 종류가 있습니다:
- Inner Join: 가장 일반적인 조인입니다. 두 테이블 모두에 포함된 내용만 반환합니다.
- Left Join: 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행이 포함됩니다. 일치하지 않는 오른쪽 테이블의 행은 null 값을 가집니다.
- Right Join: 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행이 포함됩니다. 일치하지 않는 왼쪽 테이블의 행은 null 값을 가집니다.
- Full Join: 조인 조건에 일치하는 행이 있는지에 관계없이 두 테이블의 모든 행이 결합됩니다. 일치하지 않는 행은 해당 열에 null 값을 갖습니다.
Primary와 Foreign key의 차이점이 무엇인가요?
[Primary Key(기본 키)]
- Uniqueness: 테이블의 각 행에 고유 식별자가 있는지 확인합니다. 이를 통해 레코드 중복을 방지하고 효율적인 데이터 검색이 가능합니다.
- Single Key: 테이블은 기본 키를 하나만 가질 수 있습니다.
- Not null: 기본 키 열은 일반적으로 null 값을 허용하지 않습니다.
[Foreign Key(외래 키)]
- Relationship Builder: 두 테이블 간의 연결을 설정합니다. 다른 테이블의 기본 키를 참조합니다.
- Multiple Keys: 한 테이블에 여러 개의 외부 키가 있을 수 있습니다.
- Nullable: 외부 키 열은 null 값을 허용합니다.
REST-API란 무엇인가요?
REST API는 Representational State Transfer API의 약자입니다. 웹 API를 설계하는 데 널리 사용되는 스타일입니다. 간단히 말해, HTTP 요청 및 응답을 사용하여 통신하는 방법에 대한 일련의 규칙을 정의합니다. 이를 통해 응용 프로그램은 사용된 프로그래밍 언어에 관계없이 표준화된 방식으로 서로 쉽게 상호 작용할 수 있습니다.
언제 캡슐화와 추상화를 사용하나요?
캡슐화와 추상화는 코드 재사용성, 유지 보수성 및 보안을 강화하는 객체 지향 프로그래밍(OOP)의 기본 개념입니다.
[캡슐화]
- 데이터 숨김 및 보호: 객체의 내부 데이터에 대한 접근을 제어하고자 할 때 사용합니다. 데이터를 비공개로 설정하고 접근할 수 있는 메서드를 따로 제공하여 데이터 무결성을 보장하고 의도하지 않는 수정을 방지할 수 있습니다.
- 은행 클래스에서 계좌금액 데이터를 캡슐화하여 입출금과 같은 적절한 방법을 통해서만 접근하게 합니다.
[추상화]
- 기능에 집중: 추상화를 사용하여 클래스의 구현 세부 사항을 숨기고 인터페이스 또는 추상화 클래스를 통해 필수 기능만 노출합니다. 이를 통해 사용자는 기본 세부 구현에 대한 걱정 없이 객체와 상호 작용할 수 있습니다.
[결론]
- 캡슐화를 사용하여 객체의 내부 데이터를 보호하고 데이터 접근을 제어합니다.
- 추상화를 이용하여 "how"보다 "what"에 집중합니다.
Lazy Loading과 Eager Loading을 설명해주세요
Hibernate와 같은 ORM 프레임워크에서 데이터를 가져오기 위한 두 가지 전략이 Lazy loding과 Eager loading입니다. 데이터베이스에서 관련 객체가 로드되는 시기와 방법을 결정합니다.
[Lazy Loading(지연 로딩)]
- Delay Loading: 데이터는 명시적으로 필요한 경우에만 검색됩니다. 사용자가 특정 제품을 클릭할 때만 제품 설명이나 리뷰와 같은 정보가 로딩되도록 합니다.
- Performance Benefits: 사용하지 않는 데이터에 대한 불필요한 쿼리를 방지함으로써 데이터 로딩 시간을 개선할 수 있습니다.
- Potential for Extra Queries: 관련 데이터가 필요한 경우 지연 로딩으로 인해 추가 쿼리가 실행되어 오버헤드가 발생할 수 있습니다.
[Eager Loading(즉시 로딩)]
- Loads Everything Upfront: 모든 관련 데이터를 단일 쿼리에서 기본 객체와 함께 가져옵니다. 이는 사용자가 모든 데이터를 보지 않더라도 모든 제품 정보가 목록 페이지에 로드되는 것을 의미합니다.
- Faster Access to Related Data: 데이터를 이미 불러왔으므로 관련 정보에 접근할 때 추가적인 쿼리가 필요하지 않습니다. 데이터 대부분을 사용해야 하는 시나리오의 경우 성능이 향상될 수 있습니다.
- Potentially Slower Initial Load: 필요하지 않을 수도 있는 데이터를 가져오는 경우 초기 페이지 로딩 시간이 길어질 수 있습니다.
@GetMapping과 @PostMapping을 언제 사용하나요?
[@GetMapping]
- HTTP GET 요청을 처리하는 메서드에서 이 어노테이션을 사용합니다. 일반적으로 서버에서 데이터를 검색하는 데 사용됩니다.
- 리소스 목록 가져오기
- 특정 리소스의 세부 정보 가져오기
- 검색 또는 필터링 요청 처리
@Controller
public class ProductController {
@GetMapping("/products")
public List<Product> getAllProducts() {
// Logic to retrieve all products from the database
}
}
[@PostMapping]
- HTTP POST 요청을 처리하는 메서드에 이 어노테이션을 사용합니다. 일반적으로 생성 또는 업데이트 목적으로 서버에 데이터를 제출하는 데 사용됩니다.
- 새 리소스 생성
- 기존 리소스 업데이트
- 리소스 삭제
@Controller
public class ProductController {
@PostMapping("/products")
public Product createProduct(@RequestBody Product product) {
// Logic to save the new product to the database
}
}
메서드 오버라이딩에 대한 예외 처리 규칙에는 어떤 것이 있나요?
[Same or Subclass Exception]
- 슈퍼클래스의 메서드가 checked exception을 선언할 때, 오버라이딩된 메서드는 동일한 예외를 선언하거나 해당 예외의 하위 클래스를 선언할 수 있습니다. 이를 통해 하위 클래스에서 보다 구체적인 예외 처리가 가능합니다.
class SuperClass {
public void doSomething() throws IOException {
// ...
}
}
class SubClass extends SuperClass {
@Override
public void doSomething() throws FileNotFoundException { // Subclass of IOException
// ...
}
}
[No Checked Exception]
- 만약 슈퍼클래스 메서드가 예외를 선언하지 않으면, 하위 클래스의 메서드는 checked exception을 선언할 수 없습니다. 그러나, unchecked exception은 선언할 수 있습니다.
class SuperClass {
public void doSomething() {
// ...
}
}
class SubClass extends SuperClass {
@Override
public void doSomething() throws IOException { // Not allowed (superclass doesn't throw IOException)
// ...
}
}
Spring MVC 플로우에 대해 설명해 주세요
Spring MVC는 MVC 아키텍처 패턴을 따르며, 이 패턴은 애플리케이션 로직, 데이터 프레젠테이션 및 사용자와의 상호작용을 분리하여 유지 보수성과 테스트성을 높입니다.
- Client Request: 사용자가 브라우저를 통해 웹 프로그램과 상호 작용하여 서버의 특정 URL에 대한 HTTP 요청을 날립니다.
- DispatcherServlet Intercept: DispatcherServlet이 Spring MVC의 프론트 컨트롤러 역할을 하며, 웹 컨테이너(Tomcat/Jetty)로부터 들어오는 모든 HTTP 요청을 수신합니다.
- Handler Mapping: DispatcherServlet이 요청을 처리할 컨트롤러 메서드를 결정하기 위해 일반적으로 RequestMappingHandlerMapping으로 구현되는 HandlerMapping을 참조합니다.
- Handler Selection: HandlerMapping은 요청 URL 및 HTTP 메서드 기반으로 요청을 처리할 적절한 컨트롤러 클래스 및 메서드를 식별합니다.
- Controller Invocation: DispatcherServlet은 스프링 의존성 주입을 사용하여 식별된 컨트롤러 클래스의 인스턴스를 생성합니다. (아직 생성되지 않은 경우에) 그런 다음 컨트롤러에서 해당 메서드를 호출하여 요청 객체를 인수로 전달합니다.
- Model Population: 메서드 안에서 비즈니스 로직이 실행됩니다.
- View Resolution: 모델이 채워지면 컨트롤러는 응답을 렌더링 할 뷰를 선택해야 합니다. 일반적으로 ViewResolver를 사용하여 적절한 뷰 템플릿을 선정합니다.
- View Rendering: ViewResolver는 view name을 기준으로 뷰 템플릿을 찾습니다. 모델 객체는 최종 HTML 응답을 렌더링 하기 위해 뷰 엔진(JSP/FreeMarker)으로 전달됩니다. 렌더링 된 HTML 응답은 클라이언트의 브라우저로 다시 전송됩니다.
출처
'레퍼런스' 카테고리의 다른 글
[Medium] 개발 세계에서 인기 있는 API 아키텍처 스타일 (0) | 2024.04.17 |
---|---|
[Medium] 2024 버클리즈 Java SpringBoot 인터뷰 질문 (3) (0) | 2024.04.10 |
[Medium] 2024 버클리즈 Java SpringBoot 인터뷰 질문 (1) (0) | 2024.04.01 |
[Medium] Kafka vs. RabbitMQ: 알맞은 메시지 브로커 찾기 (0) | 2024.03.25 |
[Medium] ChatGPT에게 Java Streams API를 가르쳐 달라고 요청해보자 (0) | 2024.03.20 |