현재 코드프레소에서 진행하고 있는 JAVA 웹개발 커리큘럼에 참여중에 있습니다.
그 중 Spring boot에 대한 학습내용을 적어보고자 합니다.
스프링 부트
1. 끊임없는 개선 및 다양한 지원 (클라우드, native 등등...)
2. 높은 러닝 커브
3. 복잡한 설정 (무겁다, 대기업에서나 쓸 법한 기술)
Web 및 HTML
- WWW(web)은 인터넷에서 정보를 공유하는 기술 중 하나
- 웹상에서는 Hyper Text로 정보를 공유
- Hyper Text를 쓰는 언어는 HTML
- HTTP는 서버 간 Hyper Text 를 주고받는 표준 규약
스프링부트의 계층형 아키텍처 패턴
- 아래와 같이
- 웹브라우저 → Presentation layer → Application layer → Data Access layer → DB
- 순으로 진행되게끔 구조를 짠다
스프링 컨트롤러 (Spring Controller)
- Presentation layer에 해당
- client request를 받아 application layer에 넘기는 역할 + 최종 결과물을 client 에게 전달하는 역할
- 3가지 Annotation (JAVA에게 추가적인 정보를 제공하는 방법)이 사용됨
- 자바 컴파일러에게 정보를 제공
- SW 툴에 의해 사용되어 코드 생성이나 추가 작업을 진행
- 런타임시 특정 동작을 추가로 진행해야할 때
- Annotation이 장착된 코드들은 스프링부트 프레임워크에 의해 관리된다
- @Controller: view 의 영역을 응답 (html, css)
- return "hello"; 이면 hello.html 파일을 return
- @RestController: data 의 영역을 응답 (string, json, xml)
- return "hello"; 이면 "hello" 문자열을 그대로 return
- @RequestMapping: client 요청('/path' 및 URL 정보) 에 따라 해당하는 메소드를 실행
- Controller 클래스에도 명시 가능한데 이러면 해당 클래스 안에 있는 메소드들의 공통 path를 암시함
- 클래스 내부 메소드에 보통 장착함
- 아래의 메소드들의 URI는 /user/paid, /user/enterprise ... 순이다
- @Controller: view 의 영역을 응답 (html, css)
Request 파라미터
- 서버에 데이터를 요청할 때 추가적인 데이터(정보)를 보내는 것
- 추가적으로 전송되는 데이터 = request 파라미터
- Query String
- ? 이후의 category → key, = 이후의 it → value
- 파라미터는 옵션을 주어서 (required, defaultValue 등등) 꼭 받지 않게 할수도, 기본값을 줄수도 있음
- @RequestParam 사용
- Path Parameter
- @PathVariable 사용
- 어떤 상황에서 path parameter / query string 형식을 쓸지는 사바사, 회바회임
- 일반적으로는 특정자원은 path param으로, 정렬이나 추가 필터링은 query string 사용 (무조건은 절대 아님)
- Request Body
- 데이터를 저장/수정하는 POST, PUT HTTP method에서 주로 사용되는 방법
- 주로 JSON 파일 형식을 씀
- client에서 JSON 데이터를 server로 보내면, 스프링부트는 JSON을 자바객체 형태로 바꿈
Response 데이터
- 클래스 객체를 response로 보내면 스프링부트 내에서 객체를 JSON 파일 형식으로 바꿔서 내보낸다
- 이때 객체에는 멤버변수에 접근할 수 있게 getter 메소드들을 추가해야함 (스프링부트가 getter를 참조하여 객체 -> JSON, JSON->객체 하기때문)
HTTP API vs REST API
- Interface: 두 개체 간의 상호작용 (정보 공유)을 할 때 필요한 규약(방법)
- API: 컴퓨터(프로그램) 간의 정보를 공유하기 위한 규약(방법)
- HTTP API: HTTP/HTTPS 를 활용하여 원격의 데이터를 공유하기 위한 API
- REST API: 웹상에서 효율적으로 데이터 공유를 하기 위한 아키텍처 스타일
- REST API 의 모든 조건을 만족하는 HTTP API 를 REST API라 칭하지만 일반적으로 혼용해서 씀
HTTP Method
- HTTP 규약 중 하나로, 특정 자원에 대해 수행하는 행동의 종류를 명시
- POST, GET, PUT, DELETE 4개가 주로 사용됨
- 단일 URI 로 여러가지 작업 (조회, 수정, 업데이트, 삭제) 가능
- 아래처럼 JSON response를 받으려면 @RequestBody 를 파라미터 옵션으로 넣어줘야함
- 그래야만 스프링부트에서 JSON을 객체로 변환해서 userDto 변수에 넣어줄 수 있음
스프링 서비스 (Spring Service)
- 시스템의 핵심 비즈니스 로직을 구현하는 계층
- 이미지, 그림, 컨텐츠 정보 저장 로직
- 유저에게 컨텐츠 추천 로직
- View 종류와 DB 종류의 변화에 상관없이 독립적으로 항상 작동해야함
- @Service annotation을 추가하여 사용
- 프로그램의 세부 영역 별로 클래스를 생성하여 구현
- 아래와 같이 controller 부분에서는 request를 받고 request에 대한 기능수행을 service 에게 위임을하고 service한테 다시 response를 받아서 client 에게 보내주는 역할임
- 즉, request, response를 client 와 주고 받는건 controller(원청업체) 부분이지만, 기능 수행은 service에게 하청(?) 때림
Spring Bean (스프링 빈) 과 Dependency Injection (의존성 주입)
- A 모듈 (패키지,메소드)가 B 모듈을 사용한다면, A가 B에 의존한다고 볼 수 있음
- 이렇게 다른 객체(모듈)을 사용할때는 해당 객체를 new 를 통해 객체생성을 하게 되는데,
- 이러한 객체생성을 외부에서 대신 해주는 것을 의존성 주입이라고함 (더이상 new를 통해 객체생성 안해도 됨)
- 활용할 객체에 대한 의존성을 compile 단계가 아닌 runtime 단계에서 정하게 할 수 있음
어떤 특정 형태의 PostService 객체가 올지 runtime때 정함 - 이러한 객체 생성과 관리는 특정 조건을 만나면 스프링 프레임워크가 관리함
- 클래스 상단의 (@Controller, @RestController, @Service) annotation을 만나면 스프링이 객체를 생성
- @Configuration 클래스의 @Bean annotation
- Spring IoC 컨테이너
- 스프링 프레임워크에서 객체의 생성과 관리의 역할을 담당
- IoC 컨테이너에 [ 자바 소스코드, 클래스, config, @Controller, @Service... 등등] 많은 정보가 담기게 되고 이를 통해 스프링프레임워크가 자동으로 분석하고 여러 Bean을 생성하고 Bean들간의 의존성을 생성
- Spring Bean
- 스프링 IoC 컨테이너에 의해서 생성되고 관리되는 Java 객체
- 사용자가 new를 통해서 만드는 객체가 아니라 스프링 자체에서 만들고 관리함에 주의
질문
1. int 대신 integer를 쓰시는 이유가 있을까요
2. @controller @RestController, @Service 말고 언제 @Configuration, @Bean을 통해 bean 객체를 만들어야하나요?
3. @Bean 은 보통 어느 소스코드에 작성하나요?
4. todo-mapper.xml 에서 sql 작성할 때 #, $의 차이가 무엇인가요?
'JAVA 웹개발 - 코드프레소' 카테고리의 다른 글
Spring Boot 웹 개발 초급 (0) | 2022.02.23 |
---|---|
SQL 프로그래밍 입문 (0) | 2022.02.03 |
Clean Code란 무엇인가? (0) | 2022.01.25 |
자바 프로그래밍 2 (0) | 2022.01.21 |
Git 형상관리 2 (0) | 2022.01.18 |