< MVC 패턴 >
- 웹 애플리케이션이 점점 복잡해짐에 따라, 구조적인 패턴이 필요해졌다.
- 그중 가장 널리 사용된 것이 MVC 패턴이다
- MVC 패턴: Model-View-Controller의 약자로, 애플리케이션을 세 가지 주요 컴포넌트로 나눠 관리하는 방식이다.
- Model: 데이터와 비즈니스 로직을 관리.
- View: 사용자에게 보여지는 화면(UI).
- Controller: 사용자의 요청을 처리하고, 적절한 Model과 View를 연결.
- 이 패턴을 사용하면 애플리케이션의 유연성과 유지보수성이 크게 향상된다.
< Spring 프레임워크 >
- 자바 기반 웹 애플리케이션의 복잡성이 증가하면서, 이를 효과적으로 관리하고 확장할 수 있는 프레임워크의 필요성이 대두되었다.
- 그 중 가장 성공적인 프레임워크가 Spring이다
- Spring은 경량화된 자바 애플리케이션 개발을 위한 프레임워크로, 객체 지향 프로그래밍의 의존성 주입(DI)과 관점 지향 프로그래밍(AOP)을 지원한다
- Spring Boot: Spring의 설정을 최소화하고, 빠르게 애플리케이션을 시작할 수 있도록 돕는 도구로, 자바 기반의 웹 애플리케이션 개발을 간소화했다.
==> Java는 Servlet과 JSP를 통해 초기 웹 개발에서 중요한 역할을 했고, MVC 패턴과 JSP Model 2는 웹 애플리케이션을 구조적으로 개발하는 데 기여했다. 또한, Spring 프레임워크는 이러한 구조를 더욱 체계적으로 확장해 대규모 엔터프라이즈급 웹 애플리케이션 개발의 핵심 기술로 자리 잡았다.
< Spring >
- Java 기반의 오픈소스 애플리케이션 프레임워크로, 주로 엔터프라이즈 애플리케이션 개발에 사용된다
- 의존성 주입 (Dependency Injection): Spring은 객체 간의 의존성을 관리하여 코드의 결합도를 낮추고 테스트 용이성을 높인다
- 모듈화: Spring은 다양한 모듈로 구성되어 있어 필요한 기능만 선택해 사용할 수 있다. 예를 들어, Spring MVC, Spring Data, Spring Security 등이 있다.
- 트랜잭션 관리: Spring은 선언적 트랜잭션 관리를 지원하여 데이터베이스 작업의 일관성을 보장한다
- AOP (Aspect-Oriented Programming): 공통 관심사를 분리하여 코드의 재사용성을 높이고 유지보수를 쉽게 한다
- RESTful API 개발: Spring은 RESTful 웹 서비스를 쉽게 만들 수 있도록 도와준다. Spring Boot는 이를 더욱 간편하게 해주는 도구이다
- 테스트 지원: Spring은 JUnit과 같은 테스트 프레임워크와 통합되어 테스트를 쉽게 작성할 수 있도록 돕는다
- Spring Boot는 Spring의 설정을 간소화하고 빠르게 애플리케이션을 개발할 수 있도록 돕는 도구로, 기본적인 설정을 자동으로 처리해 주기 때문에 개발 속도가 크게 향상된다
< 선언적 트랜잭션 관리 >
- 트랜잭션(데이터베이스 작업의 단위)을 코드에서 명시적으로 관리하는 대신, 설정이나 어노테이션을 통해 간단히 정의하는 방식을 의미
=> 개발자가 복잡한 트랜잭션 처리 로직을 직접 작성하지 않고도 안정적인 데이터 관리를 가능하게 해준다
- 트랜잭션: 데이터베이스에서 수행되는 일련의 작업을 하나의 단위로 묶는 것을 말한다. 모든 작업이 성공적으로 완료되거나, 문제가 발생하면 모두 롤백되어야 한다
- 선언적: 개발자가 코드 내에서 직접 트랜잭션을 관리하는 것이 아니라, 필요한 부분에 어노테이션을 추가하거나 설정 파일에서 정의하여 트랜잭션 처리를 자동으로 수행하도록 하는 것
- 코드의 간결함: 트랜잭션 관리를 코드에 직접 작성하지 않기 때문에 코드가 깔끔해지고 가독성이 높아진다
- 유지보수 용이: 트랜잭션 관리가 한 곳에 집중되어 있어 변경이나 수정이 용이하다
- 재사용성: 동일한 트랜잭션 관리 정책을 여러 곳에서 쉽게 재사용할 수 있다
- Spring에서는 @Transactional 어노테이션을 사용하여 메서드나 클래스에 트랜잭션을 설정할 수 있다
@Transactional
public void someMethod() {
// 데이터베이스 작업
}
- someMethod 내의 모든 데이터베이스 작업이 하나의 트랜잭션으로 처리된다. 이 메서드가 정상적으로 실행되면 트랜잭
션이 커밋되고, 예외가 발생하면 롤백된다
< VS Code Extension >
Spring Boot Extension Pack
- Spring Boot 애플리케이션 개발을 위한 확장 모음
- Spring Boot Extension Pack에 종속된 확장
- Spring Boot Tools
- Spring Initializr Java Support
- Spring Boot Dashboard
"java.import.gradle.java.home": "C:\\jdk-17.0.2"
- Visual Studio Code에서 Gradle 프로젝트를 사용할 때, 사용할 Java Development Kit (JDK)의 경로를 설정하는 것
- 이 경로에 있는 JDK를 사용하여 Gradle 빌드를 수행한다
- VS Code 설정: VS Code의 settings.json 파일에 이 설정을 추가하면, IDE가 해당 JDK를 인식하고 사용할 수 있게 된다. 이를 통해 빌드 및 실행 시 JDK 버전 문제를 피할 수 있다.
@SpringBootApplication
- SpringBoot 프로그램이 필요로 하는 기본 기능 탑재
- Spring Boot 애플리케이션의 진입점을 정의하며, 자동 설정을 지원한다
@Controller
- 웹페이지로서 동작 가능한 기능 탑재
- Spring MVC에서 사용되는 어노테이션으로, 주로 웹 요청을 처리하고, 해당 요청에 맞는 뷰(View)를 반환하는 데 사용된다
- @Controller가 적용된 클래스는 HTTP 요청을 받아서 클라이언트에게 HTML, JSON, XML 등의 응답을 생성할 수 있다
- HTTP 요청 처리: @Controller는 클라이언트로부터 오는 GET, POST, PUT, DELETE 요청을 처리하는 메서드가 있는 클래스를 정의한다
- View 반환: 주로 뷰 템플릿 엔진(예: Thymeleaf, JSP)과 함께 사용되어, 컨트롤러에서 처리된 데이터와 함께 HTML 페이지를 반환한다
- 이를 위해 @RequestMapping이나 @GetMapping, @PostMapping 같은 어노테이션을 함께 사용한다
@GetMapping("/hellospring")
- Spring MVC에서 사용하는 어노테이션으로, HTTP GET 요청을 특정 메서드에 매핑하는 데 사용된다
- 이는 클라이언트(주로 웹 브라우저)가 서버로 GET 요청을 보낼 때, 해당 요청을 처리할 메서드를 정의하는 역할을 한다
- HTTP GET 요청을 처리하는 메서드를 정의할 때 사용된다
- GET 요청은 주로 클라이언트가 서버로부터 리소스를 조회하거나 데이터를 가져올 때 사용된다
/hellospring:
- /hellospring은 클라이언트가 요청하는 URL 경로
- 클라이언트가 http://localhost:8080/hellospring으로 요청을 보내면, 이 요청을 처리할 메서드가 실행된다
- 이 경로는 서버의 특정 엔드포인트를 나타내며, 이 엔드포인트에 해당하는 메서드가 실행되어 적절한 응답을 반환한다
- 메서드의 URL : /hellospring
- 메서드 하나가 웹페이지 하나 !
- 메서드 이름은 맘대로
- 웹브라우저가 html에 접속하는게 아니라 Java 메서드로 접속한다
실행 (Live Reload)
< Auto Reload 설정 >
1. Chrome Extension에 RemoteLiveReload 설치
2. VSCode에 아래 설정값 추가
"java.debug.settings.hotCodeReplace": "auto",
"spring.dashboard.openWith": "external"
< 실행하기 >
Spring Boot Dashboard의 Apps 섹션에서 프로젝트 이름 우측에 표시되는 Debug 클릭
- ENDPOINT MAPPINGS 섹션에서 접속할URL 우측의 OPEN 버튼 클릭하거나
- http://localhost:8080/hellospring의 URL을 통해 결과 확인
- Java Class나 HTML이 수정된 경우 별도의 재시작 없이 컴파일 내용이 갱신되므로 웹 브라우저만 새로고침 하여 결과를 확인한다
- build.gradle이 변경된 경우는 프로그램을 재시작 해야 한다
@GetMapping("/now")
public void world(Model model) {
model.addAttribute("nowtime", new Date().toString());
}
- /now:
- 클라이언트가 이 URL 경로로 요청을 보내면 해당 메서드가 실행된다
- 예를 들어, 브라우저에서 http://localhost:8080/now를 입력하면 이 요청이 world 메서드로 전달된다
- public void world(Model model):
- 메서드 이름 world: 메서드 이름은 임의로 설정된 것, 특별한 의미는 없다
- 메서드의 파라미터는 순서 상관 X
- Spring MVC에서 메서드 이름은 중요한 역할을 하지 않으며, 실제로 중요한 것은 이 메서드에 매핑된 경로와 메서드가 하는 작업이다
- void 반환 타입:
- void 반환 타입은 별도로 뷰 이름을 반환하지 않음을 의미한다
- Spring은 이 경우 요청 URL을 뷰 이름으로 간주한다
- "/now" 경로가 뷰 이름으로 사용되며 (now.html)
- Model model
- Model 객체는 컨트롤러에서 뷰(View)로 데이터를 전달하는 역할을 한다
- 데이터를 담는 일종의 컨테이너 역할을 하며, 여기서 전달된 데이터는 나중에 HTML 페이지에서 출력될 수 있다
- 이 코드에서는 model.addAttribute()를 사용하여 데이터를 추가한다
- model.addAttribute("nowtime", new Date().toString());
- addAttribute: 이 메서드는 모델에 데이터를 추가하는 역할을 한다
- 첫 번째 인자는 키 값("nowtime"), 두 번째 인자는 저장할 값
- "nowtime"은 뷰에서 사용할 변수 이름
- 나중에 HTML 파일에서 "nowtime"으로 접근할 수 있게 된다
- 실행 흐름: ★ ★ ★ ★ ★
- 클라이언트 요청: 클라이언트가 /now URL로 GET 요청을 보낸다. ( 예: 브라우저에서 http://localhost:8080/now로 접속한다 )
- world 메서드 실행: 요청이 들어오면 world 메서드가 실행된다.
- 모델 데이터 전달: 모델에 추가된 "nowtime" 데이터를 뷰(View)로 전달한다
- 뷰 렌더링: 반환 타입이 void이기 때문에 Spring은 요청 URL인 /now를 기반으로 뷰 파일(now.html) (resources > templates > now.html)을 찾는다. 이 뷰 파일에서는 nowtime 변수를 참조하여 현재 시간을 화면에 표시할 수 있다
< Thymeleaf >
- Java 기반 템플릿 엔진으로, 서버 사이드에서 HTML, XML, JavaScript, CSS 등 다양한 텍스트 기반의 템플릿 파일을 처리하는 데 사용된다
- Thymeleaf는 Spring Framework, 특히 Spring Boot와 함께 자주 사용되며, 뷰를 생성하는데 많이 활용된다
- 서버사이드 템플릿 엔진
- Thymeleaf는 서버사이드에서 HTML을 렌더링하는 역할
- HTML 파일 안에서 데이터를 동적으로 삽입하거나 변경할 수 있는 기능을 제공한다
- 템플릿은 클라이언트에 전달되기 전에 서버에서 데이터를 기반으로 완성된다
- HTML 친화적 템플릿
- HTML5 표준을 따르는 Natural Template을 제공한다
- 브라우저에서 일반적인 HTML 파일처럼 열 수 있으며, 서버 사이드에서 Thymeleaf에 의해 처리되기 전에도 완전한 HTML 페이지로 확인할 수 있다
- Thymeleaf는 템플릿 내에서 동적 데이터를 삽입하기 위한 표현식을 제공한다
ex )
HTML
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
...
<p>지금은 <span th:text=${nowtime} class="server-time"></span>입니다</p>
Java
public void world(Model model) {
model.addAttribute("nowtime", new Date().toString());
}
=> 변수의 값을 HTML 요소에 삽입
다양한 기능 제공
- 텍스트 삽입 (th:text): 텍스트 또는 변수 값을 HTML 요소에 삽입.
- 조건부 렌더링 (th:if, th:unless): 조건에 따라 특정 요소를 렌더링하거나 숨길 수 있음.
- 반복 처리 (th:each): 리스트, 배열, 컬렉션 등을 순회하며 요소를 반복 생성.
- 링크 생성 (th:href): 동적으로 URL을 생성.
- 폼 처리 (th:field): HTML 폼에서 입력 데이터를 바인딩 및 처리.
- Spring MVC와 긴밀하게 통합되어, 컨트롤러에서 전달된 모델 데이터를 템플릿에서 바로 사용할 수 있다. Spring Boot에서는 기본 템플릿 엔진으로 Thymeleaf가 설정되어 있어, 설정이 간단하다
ex) <View>의 이름을 반환하는 컨트롤러
@GetMapping("/today")
public String nice(Model model) {
model.addAttribute("message1", "스프링부트 view 테스트 입니다");
model.addAttribute("message2", "안녕하세요");
model.addAttribute("message3", "반갑습니다");
// String 형의 메서드이므로 이 메서드가 리턴하는 문자열이 View의 이름이 된다
return "myview";
}
<h2 th:text=${message1} />
<h3 th:text=${message2} />
<p th:text=${message3} />
<img th:src="@{/img/spring.png}" alt="springboot" width="300" />
@GetMapping("/today")
- "/today" 경로로 GET 요청이 들어오면 해당 메서드를 실행하라
- 이 메서드가 HTTP GET 요청을 처리하는 경로를 지정
- 클라이언트가 "/today" 경로로 GET 요청을 보낼 때, 이 메서드가 호출된다
- 이 경로는 URL 경로로, 클라이언트(웹 브라우저나 API 클라이언트)가 서버에 요청을 보낼 때 사용하는 주소이다
- "/today"는 엔드포인트 URL 경로이다
- "/today"는 이 메서드에 접근하는 경로로 사용되며, 브라우저에서 이 URL로 접속해야 메서드가 실행된다
nice(Model model) { ...}
- 사용자가 "/today" 경로에 접근하면, nice 메서드가 실행되고, 3개의 메시지가 model에 추가된다
- 이 메서드는 "myview"라는 문자열을 반환합니다.
"myview"는 Thymeleaf와 같은 템플릿 엔진에서 뷰 파일 이름을 의미
- src/main/resources/templates/ 경로 아래에 myview.html이라는 템플릿 파일을 찾아서 렌더링한다
static 정적자원
- 이미지가 src/main/resources/static/img/ 디렉터리 아래에 위치해야 한다.
- Spring Boot에서는 기본적으로 정적 리소스(이미지, CSS, JavaScript 파일 등)를 src/main/resources/static/에 배치하게 된다
- 서버에서 클라이언트에게 전달할 때 변경되지 않는 자원들 의미
- 이러한 파일들은 별도의 처리 없이 바로 클라이언트로 전달되며, Spring Boot는 기본적으로 정적 자원에 대한 경로를 자동으로 설정해 준다
동작 과정 ★ ★ ★ ★ ★
- 클라이언트가 http://localhost:8080/today로 GET 요청을 보낸다
- @GetMapping("/today")가 이 요청을 받아 nice 메서드를 실행한다
- model에 데이터를 추가한 후, "myview"라는 뷰 이름을 반환한다
- 서버는 "myview"라는 이름의 템플릿 파일을 찾아 클라이언트에게 렌더링된 HTML을 응답한다
'IT > Spring' 카테고리의 다른 글
Spring 파일 업로드 경로 맵핑 (0) | 2024.11.21 |
---|---|
File Upload (3) | 2024.11.21 |
Interceptor (0) | 2024.10.23 |
Spring 프로젝트 구성 (0) | 2024.10.16 |
Spring 프로젝트 생성하기 (2) | 2024.10.15 |