[Java]/Spring Boot

[Java] Spring Boot: 코드, 요청&응답 과정 이해하기

기록자_Recordian 2025. 4. 16. 12:37
728x90
반응형
이전 내용
 

[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

728x90
반응형