TIL

TIL - 2024/06/11

기석김 2024. 6. 11. 15:11

오늘은 팀 프로젝트가 끝났다.

kpt 회고는 다른 게시물에 올릴 예정이다.

 

수준별로 반을 나눴는데 다른반 강의도 보면서 공부하고있다.

Spring

스프링(Spring)은 자바 언어를 위한 강력한 엔터프라이즈급 웹 프레임워크다.

웹 개발에 있어서 스프링은 전체 애플리케이션의 기반 구조를 제공하며, 특히 웹 애플리케이션을

구축하기 위한 스프링 MVC(Spring Model-View-Controller)라는 모델을 기반으로 한다.

Spring Framework

모델-뷰-컨트롤러 아키텍처: MVC

모델(Model): 컨트롤러와 데이터를 연결하고 비즈니스 로직이 작성된다.

@Service라는 어노테이션을 사용합니다

 

뷰(View): 사용자 인터페이스를 담당합니다.

요새는 FE를 나눠서 개발하기 때문에 FE에서 처리한다고 생각하자

 

컨트롤러(Controller): 사용자의 요청을 처리하고 모델과 뷰 사이를 연결

. @Controller라는 어노테이션을 사용

 

Bean 관리

 

싱글턴(Singleton) 패턴: 기본적으로, 스프링은 각 빈 정의에 대해 하나의 객체 인스턴스만을 생성한다.

이는 싱글턴 디자인 패턴을 따르는 것으로, 같은 빈 ID나 이름으로 컨테이너에 요청을 하면,

스프링은 항상 동일한 객체 인스턴스를 반환한다.

 

의존성 주입(Dependency Injection): 빈은 생성자 인수나 세터 메서드를 통해 의존성을 주입받을 수 있다.

이렇게 함으로써 빈은 필요한 의존성을 외부로부터 받으며 느슨한 결합과 코드의 테스트 용이성을 증진시킨다.

 

어노테이션 또는 XML 구성: 빈은 XML 파일을 통해 명시적으로 선언하거나,

클래스에 @Component, @Service, @Repository, @Controller 등의 어노테이션을

사용하여 자동으로 감지되어 등록될 수 있습니다

 

웹 흐름의 기초

DNS 조회: 브라우저는 도메인 이름 시스템(DNS)을 사용하여 google.com과 같은 호스트명을 IP 주소로 변환

 

서버와의 연결: 브라우저는 변환된 IP 주소를 사용하여 서버에 TCP 연결을 시도한다.

HTTPS를 사용하는 경우, SSL/TLS 핸드셰이크 과정을 통해 암호화된 연결이 설정된다.

 

HTTP 요청: 브라우저는 HTTP 프로토콜을 통해 서버에게 웹 페이지를 요청한다.

GET 메서드는 URL에 지정된 리소스를 요청

 

DispatcherServlet 수신: 모든 요청은 먼저 Spring의 DispatcherServlet에 도달한다.

이 서블릿은 프론트 컨트롤러로 작동하여 들어오는 요청을 적절한 컨트롤러에 전달하는 역할을 한다.

 

핸들러 매핑: DispatcherServlet은 요청 URL을 분석하여 해당 요청을 처리할 수 있는 컨트롤러를 찾는다.

이를 위해 HandlerMapping을 사용

 

비즈니스 로직 처리: 컨트롤러 내부의 메서드는 사용자의 요청과 함께 전달된 파라미터, 예를 들어

상품의 id,를 처리한다. 이 정보는 서비스 계층에 전달되어 필요한 비즈니스 로직을 수행할 수 있다

 

모델 채우기: 서비스 계층에서의 처리 결과를 컨트롤러가 다시 받아 모델 객체에 데이터를 채운다.

모델 객체는 주로 요청에 대한 응답으로 보낼 데이터를 포함한다.

 

응답 생성 및 전송: 서버는 HTML OR Json 응답 데이터를 생성하여 브라우저로 전송

 

콘텐츠 렌더링: 브라우저는 받은 HTML, CSS, JavaScript 등을 해석하고

사용자에게 웹 페이지를 보여주기 위해 렌더링한다.

 

추가 리소스 로딩: HTML 문서 내에 추가 리소스(이미지, 스타일시트, 스크립트 등)가 있을 경우,

이들도 필요에 따라 각각의 요청을 통해 로드하고 처리

 

RESTful API 설계

RESTful API란??

REST(Representational State Transfer)는 웹 표준을 기반으로 하는 API 설계 아키텍처,

RESTful API는 네트워크 상에서 클라이언트와 서버 간의 통신을 위해

자원(Resource)의 상태를 전달하는 방법을 정의,

클라이언트가 서버의 자원에 접근하고 이를 활용할 수 있도록 하는 역할을 한다.

 

자원 중심의 URI 설계

자원의 식별: 각 자원은 명확한 URI로 식별되어야 한다.

URI는 명사를 사용: 자원은 동사가 아닌 명사를 사용하여 표현합니다. 예: /getUsers 대신 /users

 

HTTP 메서드를 통한 행위 정의

GET: 자원을 조회합니다. 서버에 데이터를 변경하지 않는 안전한(read-only) 작업에 사용

POST: 새로운 자원을 생성합니다. 예를 들어, 새 사용자 추가에 사용

PUT: 자원을 업데이트합니다. 자원의 전체를 교체하는 데 사용

DELETE: 자원을 삭제

 

@PathVariable

@PathVariable은 URL 경로에 포함된 변수를 컨트롤러 메서드의 매개변수로 바인딩하는 데 사용

 

특징은 URL 경로의 일부를 변수로 사용하여, 동적으로 변하는 URL 경로를 처리

간결하고 직관적인 API 경로를 설계 가능

 

예제

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{userId}")
    public String getUser(@PathVariable("userId") Long userId) {
        // userId를 사용한 로직 처리
        return "User ID: " + userId;
    }
}

cURL 요청:http://localhost:8080/users/123 URL로 GET 요청을 보내며,

여기서 123은 userId로 컨트롤러에서 처리된다.

curl -X GET "<http://localhost:8080/users/123>"

@RequestParam

@RequestParam은 클라이언트가 전송하는 HTTP 요청 파라미터를

컨트롤러 메서드의 매개변수로 바인딩하는 데 사용

 

특징은 URL에서 지정된 이름의 파라미터를 메서드 매개변수로 전달 하고

필수 여부, 기본값 설정 등의 추가적인 설정이 가능

@GetMapping("/products")
public String getProduct(@RequestParam("id") Long productId) {
    // productId를 사용한 로직 처리
}

cURL 요청:이 cURL 요청은 id 파라미터로 123을 전달

bashCopy code
curl -X GET "http://localhost:8080/products?id=123"

 

@RequestBody

@RequestBody는 클라이언트가 전송하는 HTTP 요청의 본문(body)을 Java 객체로 변환하여 받는다

 

특징은 HTTP 요청 본문의 내용을 자바 객체로 역직렬화하고

주로 JSON형식의 데이터 처리에 사용

javaCopy code
@PostMapping("/api/user")
public String apiUser(@RequestBody User user) {
    // user 객체를 사용한 로직 처리
}

cURL 요청:이 cURL 요청은 JSON 형식의 본문 데이터를 전송하며,

Content-Type 헤더를 application/json으로 설정

bashCopy code
curl -X POST "http://localhost:8080/api/user" -H "Content-Type: application/json" -d '{"username":"JohnDoe", "email":"john@example.com"}'