오늘은 팀 프로젝트가 끝났다.
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"}'
'TIL' 카테고리의 다른 글
TIL - 2024/06/13 (0) | 2024.06.13 |
---|---|
TIL - 2024/06/12 (0) | 2024.06.12 |
TIL - 2024/06/10 (0) | 2024.06.10 |
TIL - 2024/06/07 (0) | 2024.06.07 |
TIL - 2024/06/05 (0) | 2024.06.05 |