[Java] Spring Boot: 코드, 요청&응답 과정 이해하기
이전 내용
[Java] Spring Boot: Maven Repository
이전 내용 [Java] 스프링부트: Spring Initializr - Dependencies이전 내용 [Java] Spring Boot: 제어 역전, 의존성 주입이전 내용 [Java] Spring Boot - 기본 구조, "Hello World" 띄워보기이전 내용 [Java] 인텔리제이 새 프
puppy-foot-it.tistory.com
스프링 부트 기본 코드 이해하기
1. @SpringBootApplication: 스프링 부트 관련 설정을 나타내는 애너테이션
@SpringBootApplication
public class SpringApplication {
public static void main(String[] args) {
SpringApplication.run(SpringApplication.class, args);
}
자바의 main() 메서드와 같은 역할로, 여기서부터 스프링 부트가 시작된다.
@SpringBootApplication 애너테이션을 추가하면 스프링 부트 사용에 필요한 기본 설정을 해준다.
SpringApplication.run() 메서드: 애플리케이션 실행 ▶ class: 스프링 부트 메인 클래스로 사용할 클래스, args: 커맨드 라인의 인수
2. @SpringBootApplication 애너테이션 구성
인텔리제이에서 ctrl을 누른 상태로 @SpringBootApplication 애너테이션을 누르면 상단의 이미지가 나타나는 데, 이 내용들이 @SpringBootApplication 애너테이션을 구성하는 것들이다.
@ComponentScan: 사용자가 등록한 빈을 읽고 등록하는 애너테이션으로, @Component 애너테이션을 가진 클래스들을 찾아 빈으로 등록을 하는 역할을 한다.
애너테이션 이름 | 역할 |
@Configuration | 설정 파일 등록 |
@Repository | ORM 매핑 |
@Controller, @RestController | 라우터 |
@ Service | 비즈니스 로직 |
- 컨트롤러: 프레젠테이션 계층 ▶ HTTP 요청을 받고 이 요청을 비즈니스 계층으로 전송하는 역할
- 서비스: 비즈니스 계층 ▶ 모든 비즈니스 로직을 처리 ※ 비즈니스 로직: 서비스를 만들기 위한 로직(웹 사이트에서 벌어지는 모든 프로세스를 구현하기 위한 로직)
- 리포지토리: 퍼시스턴스 계층 ▶ 모든 데이터베이스 관련 로직을 처리 (데이터베이스에 접근하는 DAO 객체 사용 가능) ※ DAO 객체: 데이터베이스 계층과 상호작용하기 위한 객체
@EnableAutoConfiguration: 자동 구성을 활성화하는 애너테이션. 스프링 부트 서버가 실행될 때 스프링부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할 수행.
스프링 부트 요청-응답 과정 이해하기
[주요 과정]
클라이언트가 HTTP 요청을 보낸다.
↓
요청은 컨트롤러에 매핑되어 처리된다.
↓
서비스 계층에서 비즈니스 로직이 수행된다.
↓
데이터베이스와의 상호작용이 필요할 경우, Repository를 통해 데이터를 처리한다.
↓
최종적으로 응답이 생성되어 클라이언트에게 전송된다.
1. 클라이언트의 요청
- HTTP 요청: 클라이언트(일반적으로 웹 브라우저 또는 모바일 앱)는 서버에 HTTP 요청을 보낸다. 이 요청은 특정 URL(endpoint)에 대해 GET, POST, PUT, DELETE 등의 메서드를 사용할 수 있다.
▶ 예를 들어, 사용자가 로그인 버튼을 클릭하면, 클라이언트는 사용자 이름과 비밀번호를 포함한 요청을 보냄.
2. 서버의 요청 수신
- 스프링 부트 애플리케이션; 서버 측에서 애플리케이션이 실행 중이며 클라이언트의 요청이 도착하면, 스프링 부트는 이를 수신하여 처리할 준비를 한다.
3. 컨트롤러(Controller) 처리
- 매핑(Mapping): 스프링 부트에서는 @RestController 또는 @Controller를 사용하여 요청을 처리하는 클래스를 정의한다. 이 클래스 내에 각 요청 메서드에 대해 @RequestMapping 애너테이션을 통해 URL을 매핑할 수 있다.
▶ 컨트롤러는 요청을 처리하는 클래스로, 특정 URL 경로와 HTTP 메서드(GET, POST 등)에 따라 어떤 메서드가 실행될지를 설정한다.
@RestController
public class UserController {
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody User user) {
// 로그인 처리 로직
return ResponseEntity.ok("로그인 성공");
}
}
- 메서드 실행: 클라이언트의 요청이 해당 URL에 매핑된 메서드를 호출한다. 예를 들어, 사용자의 입력 정보나 요청 본문(body)을 @RequestBody 애너테이션을 사용하여 DTO(Data Transfer Object)로 변환한다.
※ DTO(Data Transfer Object): 계층 간 데이터 교환을 위해 사용하는 객체로, 주로 네트워크를 통해 데이터 이동 시, 복잡한 도메인 모델 대신 간단한 데이터 구조를 사용하여 전송한다.
- 목적: 불필요한 데이터 전송을 줄이고, 성능을 최적화하기 위해 필요한 값들만 포함한다.
- 구조: DTO는 일반적으로 필드와 그에 대한 게터(getter) 및 세터(setter) 메서드만 포함하는 간단한 클래스다.
4. 서비스(Service) 호출
- 비즈니스 로직 처리: 요청이 컨트롤러에 도착하면, 필요한 경우 서비스 계층으로 요청을 전달한다. 서비스 계층에서는 비즈니스 로직을 수행하고, 필요한 데이터를 처리한다.
▶ 서비스 클래스: 비즈니스 로직을 처리하는 곳으로, 로그인 처리, 데이터 검증 등 필요한 로직이 이곳에서 실행된다.
5. 데이터베이스 접근
- Repository 호출: 데이터베이스와의 상호작용이 필요한 경우, JPA와 같은 ORM(Object Relational Mapping) 기술을 통해 Repository를 사용하여 데이터를 조회하거나 수정할 수 있다.
※ JPA(Java Persistence API)
JPA는 자바 객체와 데이터베이스 간의 매핑을 위한 표준 인터페이스다. 객체지향 프로그래밍의 장점을 활용하여 데이터베이스와의 상호작용을 단순화한다.
- 매핑: 클래스와 테이블 간의 매핑을 통해 객체를 데이터베이스에 쉽게 저장하고 조회할 수 있다.
- 드라이버 독립성: 다양한 데이터베이스에 호환 가능하다.
[주요 구성 요소]
- Entity: 데이터베이스 테이블과 매핑되는 클래스로, 주로 @Entity 어노테이션으로 지정한다.
- Repository: 데이터베이스에 접근하는 인터페이스로, CRUD(Create, Read, Update, Delete) 작업을 정의한다.
※ORM (Object-Relational Mapping)
ORM은 객체 지향 프로그래밍 언어에서 객체를 관계형 데이터베이스와 매핑하는 기술로, 데이터베이스의 테이블과 애플리케이션의 객체 간 매핑 작업을 자동으로 수행하여, 개발자가 SQL 쿼리를 직접 작성하지 않도록 도와준다.
- 추상화: 데이터베이스와의 상호작용을 객체 지향적으로 추상화하여, SQL 쿼리의 복잡성을 줄여준다.
- 생산성: 코드의 양을 줄이고, 유지보수를 쉽게 하여 개발 생산성을 높인다.
[대표적인 ORM 프레임워크]
- Hibernate: JPA의 구현체로, 강력한 ORM 기능을 제공한다.
- MyBatis: SQL 쿼리를 XML이나 어노테이션으로 정의하므로, 더 많은 제어가 필요할 때 사용된다.
6. 응답 생성
- 결과 처리: 서비스 계층에서 처리한 결과를 컨트롤러로 반환한다. 컨트롤러는 이 결과를 바탕으로 HTTP 응답을 생성한다.
▶ 예를 들어, 로그인 성공 메시지나 오류 메시지를 반환할 수 있다.
- HTTP 응답 전송: 최종적으로 응답 내용은 @ResponseBody 애너테이션을 사용하거나, 단순히 메서드 반환값을 통해 자동으로 JSON 형태로 변환되어 클라이언트에게 전송된다.
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody User user) {
boolean isValid = userService.validateUser(user);
if (isValid) {
return ResponseEntity.ok("로그인 성공");
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("로그인 실패");
}
}
7. 클라이언트의 응답 수신
- 응답 처리: 클라이언트는 서버로부터 받은 HTTP 응답을 처리한다. 응답에는 상태 코드, 헤더, 데이터 본문이 포함된다.
▶ 예를 들어, 클라이언트는 "로그인 성공" 메시지를 받고, 이를 사용자에게 표시한다.
다음 내용
[Java] Spring Boot: 방명록 Rest API 구현(feat. MySQL 연동)
이전 내용 [Java] Spring Boot: 코드, 요청&응답 과정 이해하기이전 내용 [Java] Spring Boot: Maven Repository이전 내용 [Java] 스프링부트: Spring Initializr - Dependencies이전 내용 [Java] Spring Boot: 제어 역전, 의존성
puppy-foot-it.tistory.com