본문 바로가기
JAVA 웹개발 - 코드프레소

Spring Boot 웹 개발 입문

by 녕나 2022. 2. 3.

현재 코드프레소에서 진행하고 있는 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 ... 순이다

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을 자바객체 형태로 바꿈

@RequestBody 를 통해 JSON 형태의 parameter를 받을 수 있음

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