Spring이란?
- 자바 기반의 웹 어플리케이션을 만들 수 있는 *프레임워크
*프레임워크 vs 라이브러리- 프레임워크: 어떠한 문제를 해결하기 위해 여러 요소들과 메뉴얼을 제공하도록 짜여진 틀
- 라이브러리: 문제를 해결하는 과정에서 사용할 수 있는 도구들
- 자바 객체와 라이브러리들을 관리해주며, 톰캣과 같은 *WAS가 내장되어 있어 자바 웹 어플리케이션을 구동할 수 있다.
*WAS(Web Application Server)
- 웹 서버가 요청을 받으면 어플리케이션과 서버 환경을 필요한 기능을 수행한 후, 그 결과를 웹 서버에게 전달하는 기능을 하는 소프트웨어 프레임워크
- 웹 서버와 데이터베이스 사이에서 동작하는 미들웨어로써, 컨테이너 기반으로 동작
- Web서버는 정적인 컨텐츠를 처리 WAS는 동적인 컨텐츠를 처리
- 서버의 부하 방지, 보안상의 이유 등으로 기능 분리
- 웹 어플리케이션 컨테이너 : 웹 어플리케이션이 배포되는 공간
- 경량 컨테이너로 자바 객체를 직접 Spring 안에서 관리한다. 객체의 생성 및 소멸과 같은 생명 주기(Life cycle)을 관리하며, Spring 컨테이너에서 필요한 객체를 가져와 사용한다
- 제어의 역전 (IOC, Inversion Of Control)
- **클래스 내부의 객체 생성 -> 의존성 객체의 메소드 호출**이 아닌, **스프링에게 제어를 위임하여 스프링이 만든 객체를 주입 -> 의존성 객체의 메소드 호출**구조. 스프링에서는 모든 의존성 객체를 스프링이 실행될 때 만들어주고 필요한 곳에 주입해준다.
- 즉, 사용자가 객체를 직접 생성하지 않고 Spring이 대신 객체를 생성 및 컨트롤해준다.
- 의존성 주입 (DI, Dependary Injection)
- 어떤 객체(B)를 사용하는 주체(A)가 그 객체를 직접 생성하는게 아니라 객체를 외부(Spring)에서 생성해서 사용하려는 주체 객체(A)에 주입시켜주는 방식
- 외부(Spring)에서 직접 생성하여 관리하는 경우에는 A와 B의 *의존성이 줄어든다.
- *의존성: 변경사항이 있는 경우 서로에게 영향을 주는 정도
Spring Boot란?
- 스프링(Spring)을 더 쉽게 이용하기 위한 도구
- User는 스프링을 사용하기 위해서 이것저것 다양한 설정을 직접 해줘야된다는 문제점이 있었는데 Spring의 많은 부분을 자동화하면서 위와 같은 기능이 생성
스프링 기본 설정 (스프링 부트 기반)
IDE: IntelliJ(권장) 또는 Eclipse 설치
- Maven Project vs Gradle Project (요즘 트렌드 → 권장)
- 필요한 라이브러리를 불러와주고 빌드과정 관리해주는 툴
- 스프링 부트 버전 선택
- SNAPSHOT → 아직 개발 중
- M 시리즈 → 정식 배포 X
- Project Metadata
- Group: 기업 도메인 명
- Artifact: 빌드 결과물 (프로젝트명)
- Dependencies: 어떤 라이브러리를 사용할지
- Spring Web → 웹 서비스 개발용
- HTML(웹)을 만들어주는 태블릿 엔진 필요 → Thymeleaf (템플릿 엔진)
스프링 프로젝트 구성요소
src>main/test 로 나누어져 있음 (표준화)
- main>java:실제 package 및 소스파일
- main>resources: java외 설정파일 등
- main>test: testcode (요즘 개발 환경에서 중요)
- build.grade: 아까 설정했던 스프링 패키지의 기본 내용이 담긴 코드
- test 라이브러리는 기본적으로 포함
- 포함된 라이브러리는 모두 maveCentral() 에서 불러옴
- .gitignore: 필요한 소스코드만 git에 올라가게
- Tomcat started on port(s): 8080 (http) with context path '’
- http로 8080포트가 떴다는 뜻
- localhost: 8080 → ERROR 페이지
- 프로젝트 환경설정 성공!
- @SpringBootApplication 실행 > Tomcat이라는 웹 서버 자체 내장 >SpringBoot도 함께 실행
- 빌드가 JAVA에서 직접 실행되지 않고 Gradle을 통해 진행하는 경우: File>Settings> search Gradle >run 설정 IntelliJ
스프링 라이브러리
- External Libraries: 설정 외 웹 어플리케이션 만들기 위해서 기본으로 필요한 라이브러리 (ex. starter-web)
- 의존 관계 관리→우리가 사용하기로 설정한 라이브러리가 실행되기 위해서 필요한 라이브러리들을 Gradle이 직접 땡겨옴 (오른쪽 상단 위 ‘Gradle’ 버튼 클릭 시 의존 관계 확인 가능
- Spring Boot 라이브러리는 Spring-core를 포함한 모든 세팅을 자동 실현시켜줌
- spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
- spring-boot
- spring-core
- spring-boot-starter-logging
- logback, slf4j
- spring-boot
- spring-boot-starter-web
- spring-boot-starter-tomcat: 톰캣 (웹서버)
- spring-webmvc: 스프링 웹 MVC
- spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
- log: 현업에서 주로 사용하는 출력 시스템 / 에러 잡는 용(System.out.println X)
- slf4j: 인터페이스, 실제 로그를 어떤 구현체로 출력할 것인지에 대해서 logback과 함께 사용
Welcome Page 만들기
resources/static/index.html
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta hhtp-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>
→ 정적 페이지 (웹 서버가 웹 브라우저에 파일 그대로 반환)
→ 템플릿 엔진을 사용하면 동적으로 활용 가능
모든 튜토리얼이나 설명서: Spring.io>SpringBoot>버전선택
- *컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버( viewResolver )가 화면을 찾아서 처리한다.
- 스프링 부트 템플릿엔진 기본 viewName 매핑
- resources: templates/ +{ViewName}+ .html
참고: spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이View 파일 변경이 가능하다. 인텔리J 컴파일 방법: 메뉴> build> Recompile
*MVC 구조 (Model-View-Controller)
- 모델: 데이터를 정의하고 비즈니스 로직을 업데이트하며 관리합니다.
- 뷰: 사용자에게 보여지는 레이아웃과 화면을 처리합니다.
- 컨트롤러: 명령에 대한 응답을 통해 모델과 뷰 부분으로 라우팅합니다
*Controller
- 사용자의 요청이 진입하는 지점
- 요청에 따라 어떤 처리를 할지 결정 (실질적인 처리는 서비스 [Layered Architecture]에서 담당
- 사용자에게 View를 응답으로 반환
→Model과 View 사이를 이어주는 다리같은 존재
Controller Sample
package com.study.hellospring.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello") //웹 어플리케이션에서 /hello 들어오면 이 메소드를 호출
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
//resoure>template>hello로 가라 (SpringBoot가 다 세팅 완료)//
}
}
/*main>resources>templates>hello.html*/
안녕하세요. 손님
//Controller에 넣어줬던 data 값의 value가 text로 불러와짐
- 빌드하고 실행하기
- 콘솔로 이동 > 명령 프롬프트(cmd)로 이동 ($cd로 프로젝트 파일로 이동)
- ./gradlew > gradlew.bat 를 실행하면 됩니다.
- (명령 프롬프트에서 gradlew.bat 를 실행하려면 gradlew 하고 엔터를 치면 됩니다.)
- 빌드 제거하기 > $ gradlew clean build
정적 컨텐츠
파일을 그대로 전달
resources/static/hello-static.html
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
- 1순위: Controller → hello-static 서치
MVC와 템플릿 엔진
서버에서 변형 후 전달
Controller
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value="name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
/*@RequestParam: 기본적으로 required=true*/
View
resources/template/hello-template.html
hello! empty
- External Libraries: 설정 외 웹 어플리케이션 만들기 위해서 기본으로 필요한 라이브러리 (ex. starter-web)
*API
*API
- 프로그램들이 서로 상호작용할 수 있도록 도와주는 매개체
- 1. API는 서버와 데이터베이스에 대한 출입구 역할을 한다. API는 서버와 데이터베이스에 대한 출입구 역할을 하며, 허용된 사람들에게만 접근성을 부여해줍니다.
- 2. API는 애플리케이션과 기기가 원활하게 통신할 수 있도록 한다. API는 애플리케이션과 기기가 데이터를 원활히 주고받을 수 있도록 돕는 역할을 합니다.
- 3. API는 모든 접속을 표준화한다. API는 모든 접속을 표준화하기 때문에 기계/ 운영체제 등과 상관없이 누구나 동일한 액세스를 얻을 수 있습니다.
*Json이라는 데이터 구조 포맷으로 전달
*JSON (JavaScript Object Notation)
- 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식
- Javascript에서 객체를 만들 때 사용하는 표현식을 의미한다.
- JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용한다.
- JSON은 데이터 포맷일 뿐이며 어떠한 통신 방법도, 프로그래밍 문법도 아닌 단순히 데이터를 표시하는 표현 방법일 뿐이다.
@ResponseBody 문자 반환
>>어노테이션 관련 블로그 [Java] 어노테이션(Annotation)
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
- @ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않음
- 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님, 리소스 X)
@ResponseBody 객체 반환
@Controller
public class HelloController {
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello(); //새 객체 생성
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
- @ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨 (기본)
- @ResponseBody 를 사용
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter 가 동작
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
[참고자료]
http://melonicedlatte.com/2021/07/11/174700.html
https://velog.io/@dbfudgudals/was%EB%9E%80
https://goldsony.tistory.com/37
https://developer.mozilla.org/ko/docs/Glossary/MVC
https://velog.io/@surim014/JSON%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
'3-2기 스터디 > Spring 입문' 카테고리의 다른 글
[6주차] 스프링 핵심 원리 이해1 - 예제 만들기 (0) | 2022.05.20 |
---|---|
[5주차] 객체 지향 설계와 스프링 (0) | 2022.05.11 |
[4주차] AOP (0) | 2022.05.04 |
[3주차] 스프링 DB 접근 기술 (0) | 2022.05.04 |
[2주차] 회원 관리 예제, 스프링 빈과 의존관계 (0) | 2022.05.04 |
댓글