Spring-Basic

Doveloper·2022년 7월 3일
0

Back-end

목록 보기
4/6
post-thumbnail

김영한 CTO님의 Spring 입문 요약

Why Spring?

스프링은 굉장히 방대함. 왜 공부해야 하는가?
실무에서 제대로 동작하는 Web Application을 개발하기 위해서 Spring을 학습해야 함.

실제 동작하는 간단한 웹 앱을 빠르게 개발

  • 스프링 project 생성
  • 스프링 부트로 웹 서버 실행
  • 회원 도메인 개발
  • 웹 MVC 개발
  • DB연동 - JDBC, JPA, 스프링 데이터 JPA
  • 테스트 케이스 작성

Spring Project 생성

요즘 추세는 바닥부터 하나하나 만드는 것이 아니라, Spring boot 를 이용해서 프로젝트 생성
initializer에 맞는 version등 선택 해 주고 Generate -> 파일 다운 후 원하는 위치에 압축풀기

build.gradle 을 Intellij로 열어서 보면, 기본적으로 src에 main과 test가 존재.
main - java, resource(xml, etc) 가 존재, java밑에 실제 src code들이 존재
test - test code와 관련된 src들이 존재. (요즘 개발에서 test가 매우 중요하다는 의미)

build.gradle(중요) 이라는 설정 파일은 spring boot가 알아서 생성해 준 것임. 버전 설정하고 library 땡겨오는 기준 파일
(gitignore 또한 spring boot가 해줌)

Spring Librarys

Spring Library는 기본적으로 의존 관계에 있는 lib들을 자동으로 다 땡김. (ex-Spring-boot-starter-web 을 사용하면 gradle은 그 의존성 package들을 다 가져옴)

최근의 Spring boot 같은 경우는 전부 웹서버 등을 Embedded 한 상태. 내장되어 있음. 실행만 해도 아파치 웹서버가 떠진 이유. (예전처럼 톰캣을 따로 깔거나 할 필요가 없다.)
또한, Spring-webmvc 를 내장.

Spring-boot-starter(공통)
logging 관련 - slf4j, logback 등이 있음.
(System.out.println 대신 log를 쓰자!)

Spring-boot-starter-test
(junit, mockito, assertj, spring-test)


Spring boot 의 Welcome page는 static directory 하위 index.html을 찾아서 띄운다. (그냥 정적 html을 띄우기만 하는 역할. programming적인 요소가 1도 없음.)

  • Thymeleaf 를 사용하여 동적 html을 띄우는 것이 가능하다.

간단한 Controller의 구현

  1. Web application에서 첫번째 진입점인 controller 를 작성. HelloController라는 java file을 작성하고 @Controller@GetMapping("hello") annotation을 추가해주면,
    /hello 경로로 오는 traffic에 대하여 control 하게 됨.

  2. HelloController.java의 hello 메서드를 실행하고 model을 이용하여 key-value쌍의 data를 조작한 뒤(그것을 다른 controller나 view에서 이용할 수 있도록)
    마지막 return값으로 "hello"라는 string을 return.

  3. 그렇게 되면 Spring-boot의 템플릿 엔진이 기본적으로 ViewName을 매핑하게 됨.
    resources:templates/ + (ViewName) + .html
    따라서 ViewName이 hello인 hello.html 로 rendering 하게 되는 것이다.

  4. resources - templates 하위에 당연하게도 hello.html 이 존재해야 하며, 이 때 thymeleaf를 사용해 th 문법을 사용 가능. (javascript에서 backquote를 이용해 ${data} 이런식으로 template literal 을 사용가능.

Build 및 실행

windows는 ./gradlew.bat build
mac은 ./gradlew build

하면 그냥 build 됨😅 (build/libs directory 밑에 jar파일이 생성됨)
이 때, plain.jar가 생성되는 경우가 있는데 (정상적인 jar와 plain jar 두개 생성됨)
plain.jar는 Jar에 의해 생성된 jar임(plain archive). 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고, 소스코드의 클래스 파일과 리소스 파일만 포함... 따라서 제대로 실행되지 않음.

다른 snapshot의 jar를 이용해야 하는데 이것이 BootJar에 의해 생성된 excutable archive jar 임.

plain.jar를 없애려면 build.gradle에 다음과 같이 작성

jar {
	enabled = false
}

실행은 java -jar hello-spring-0.0.1-SNAPSHOT.jar(jar파일명)

따라서 서버 배포 시 .jar 파일만 복사해서 서버에 넣어주고 실행시키면 됨!!!
굉장히 편리..

Spring 웹 개발 기초

(Java Annotation의 parameter 정보 - windows, linux : ctrl + p / mac: cmd + p)

  • Static contents(html 파일 그대로)
  • MVC & Template Engine(JSP, PHP)(동적)
  • API(mobile.. XML, JSON data format, Server간의 통신 시 사용)
  1. Static Content

    정적 html파일은 그냥 /static 밑에 blahblah.html넣어주면 해당 경로(blahblah)로 접근하는 traffic을 blahblah.html페이지로 보내줌. (정적 컨텐츠는 spring controller가 하는 것이 아니라 Spring boot 아파치 톰캣 서버에서 그냥 처리) (사실 순서는 blahblah로 들어오는 traffic을 Spring controller에 먼저 넘기지만, blahblah를 처리하는 controller가 존재하지 않기 때문에 톰캣 서버가 resources안에 있는 blahblah.html 찾아 을 띄우는 것!!!)

  2. MVC & Template Engine

    MVC는 Data를 저장하는 Model, Business 로직과 Traffic을 처리하는 Controller, 화면에 관한 것을 보여주는 View(Template Engine) 으로 구성되어 있다.

    hello-mvc라는 경로로 들어오는 traffic을 처리하기 위해서 @GetMapping annotation을 이용해 Controller를 하나 만든다. helloMvc라는 메서드에 @RequestParam annotation으로 파라미터를 전달받도록 설정하고 Get으로 전달받은 parameter를 model에 저장.

    이후 return값은 Template Engine(Thymeleaf)으로 처리할 html 페이지(blahblah)를 return하면 viewResolver가 template/blahblah.html 에 있는 Template Engine을 통해 html을 rendering 해 준다.

  3. API

    @ResponseBody 라는 Annotation을 이용. ResponseBody를 이용하면 http요청 body를 Java 객체로 전달받을 수 있음. API방식은 화면에 html을 띄우기 위한 View 같은 것이 없고 그냥 메서드 자체에서 return 하는 값(no html) 그대로 띄워짐. (애초에 API를 사용하는 입장이면 View따위 필요가 없다.. Data가 중요한 것이기 때문에.!)

    @ResponseBody가 붙어있으면 Template Engine에 던지는 게 아니라 이걸 바로 그냥 Http response로 응답을 넘겨야 되겠구나!! 라고 반응하게 됨. HttpMessageConverter가 동작.
    문자열이면 그냥 넘기면 되는데(StringConverter), 객체라면 default값으로 JSON객체로 만들어서 반환하게 됨. (JsonConverter)(대부분 JSON)

profile
Hungry Developer

0개의 댓글