
프로젝트의 Group과 Artifect를 합쳐서 패키지 경로로 사용한다
Jar Java로만 이루어진 아카이브, Java 런타임만 있으면 실행 가능
War Web Application 아카이브, 웹 로직 (WAS) 필요


Maven 프로젝트를 생성하면 루트 디렉터리에 생성되는 파일, Project Object Model 정보
프로젝트 정보 프로젝트 이름, 개발자 목록, 라이센스 등빌드 설정 소스, 리소스, 라이프 사이클 등 실행 플러그인POM 관련 정보 의존 프로젝트 (Module), 상위 프로젝트, 하위 모듈 등<!-- 프로젝트 연관 정보 -->
<name> 프로젝트 명
<url> 프로젝트 사이트 URL
<description> 프로젝트에 대한 간단한 설명
<organization> 프로젝트를 관리하는 단체 설명
<groupId> 프로젝트 그룹 ID
<artifactId> 프로젝트 아티팩트 ID
<version> 프로젝트 버전
<packaging> 패키징 타입 (jar, war)
<!-- 프로젝트 의존 설정 -->
<dependencies> 라이브러리 의존성 정보를 가진 dependency 묶은 태그
<dependency> 각 라이브러리 정보
<groupId> 의존성 라이브러리 그룹 ID
<artifactId> 의존성 라이브러리 아티팩트 ID
<version> 의존성 라이브러리 버전
<scope> 해당 라이브러리 이용 범위
<compile> default, 모든 클래스 경로에서 사용 가능, 컴파일 및 배포 상황에서 제공
<provided> compile과 유사하지만 JDK, Container 런타임시에만 제공, 배포시에 제외
<runtime> 컴파일 시에는 사용x, 실행 상황에서만 사용됨, 컴파일 클래스 경로에 존재x
<test> 테스트 상황에서만 사용되는 라이브러리, 실 가동 상황에서 필요 없는 lib
<system> provide와 유사하지만 저장소에서 관리되지 않고 직접 관리하는 JAR 추가, systemPath 추가 필요
<optional> 다른 프로젝트에서 이 프로젝트 의존성 설정 시 사용여부
Spring Boot Starter Parent 프로젝트 lib 버전 충돌 방지, 검증된 버전 정보 조합 제공
Spring Boot Starter Web Spring MVC를 사용한 REST 서비스 개발에 사용
Spring Boot Starter Test JUnit, Hamcrest, Mockito를 포함한 테스트 기능 제공
Lombok 메소드를 만들지 않고 @Annotation을 통해 기능 구현
Model, View, Controller로 애플리케이션을 구성할 때 그 구성요소를 세 가지 역할로 구분
사용자 인터페이스로부터 비즈니스 로직을 분리하여 서로 영향 없이 고칠 수 있는 설계 가능
각 영역이 독립적으로 구성되어 각 영역에 대한 의존성이 낮아짐
Cons. 시스템이 커질수록 Controller의 역할이 커진다 => MVVM, MVP Pattern
Model과 View 사이에서 Bridge 역할을 수행
앱의 사용자로부터 입력에 대한 응답으로 Model 및 View를 업데이트 하는 로직을 포함
사용자의 요청은 모두 Controller로 진행되어야 함
Controller로 들어온 요청은 어떻게 처리할지 결정하여 Model로 요청을 전달
데이터를 처리하는 영역, DAO와 DO로 구성됨
DAO Data Access Object, 데이터베이스 연동
DO Data Object, 데이터의 구조를 표현
데이터를 보여주는 화면 자체의 영역, UI 포함, View에서는 별도의 데이터를 보관하지 않음

Spring Framework 4부터 사용 가능, @Controller와 @ResponseBody가 결합
컨트롤러 클래스 하위 메소드에 @RestController Annotation을 붙이지 않아도 문자열과 JSON 등을 전송할 수 있음
View를 거치지 않고 HTTP ResponseBody에 직접 Return 값을 담아 전송
MVC의 핸들러 매핑을 위해서 DefaultAnnotationHandlerMapping을 사용
DefaultAnnotationHandlerMapping 매핑 정보로 @RequestMapping 활용
클래스와 메소드의 @RequestMapping을 통해 URL을 매핑, 경로 설정하여 메소드에서 처리
value (url 설정), method (GET, POST, PUT, DELETE ...)
고전적인 방법으로 사용하지 않음
스프링 4.3버전부터 메소드를 지정하는 방식보다 간단하게 사용할 수 있는 Annotation 존재
아래 Annotation이 더 직관적이기에 권장됨
@GetMapping, @PostMapping, @DeleteMapping, @PutMapping ...
package studio.thinkground.testproject.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping(value = "/hello")
public String hello(){
return "Hello Spring!";
}
}
package studio.thinkground.testproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TestProjectApplication {
public static void main(String[] args) {
SpringApplication.run(TestProjectApplication.class, args);
}
}

별도의 파라미터 없이 GET API를 호출하는 경우 사용되는 방법
GET 형식의 요청에서 파라미터를 전달하기 위해 URL에 값을 담아 요청하는 방법
아래 방식은 @GetMapping에서 사용된 {변수}의 이름과 메소드의 매개변수를 일치시켜야 함\
@GetMapping(value="/variable1/{variable}")
public String getVariable1(@PathVariable String variable){
return variable;
}
@GetMapping에서 사용된 {변수}의 이름과 메소드의 매개변수 다를때 사용, 변수 관리 용이
@GetMapping(value="/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var){
return var;
}
@GET 형식의 요청에서 쿼리 문자열을 전달하기 위해 사용
?를 기준으로 우측에 {key}={value}의 형태로 전달, 복수 형태로 전달할 경우 & 사용
@GetMapping(value = "/request1")
public String getRequestParam1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
아래 예시는 어떤 요청이 들어올지 모를 경우에 사용
@GetMapping(value = "/request2")
public String getRequestParam1(
@RequestParam Map<String, String> param) {
StringBuilder sb = new StringBuilder();
param.forEach((key, value) -> sb.append(key).append(":").append(value).append("\n"));
return sb.toString();
}
GET 형식의 요청에서 쿼리 문자열을 전달하기 위해 사용되는 방법
Key와 Value가 정해져있지만, 받아야 할 파라미터가 많을 경우 DTO 객체를 사용한 방식
@GetMapping(value="/request3")
public String getRequestParam3(MemberDTO member){
return member.toString();
}
public class MemberDTO{
private String name;
private String email;
private String organization;
...
}
package studio.thinkground.testproject.controller;
import org.springframework.web.bind.annotation.*;
import studio.thinkground.testproject.dto.MemberDTO;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
@GetMapping(value="/hello")
public String getHello(){
return "Hello Spring Boot!";
}
@GetMapping(value="/name")
public String getName(){
return "judemin";
}
@GetMapping(value="/variable1/{variable}")
public String getVariable1(@PathVariable String variable){
return variable;
}
@GetMapping(value="/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var){
return var;
}
@GetMapping(value = "/request1")
public String getRequestParam1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
@GetMapping(value = "/request2")
public String getRequestParam1(
@RequestParam Map<String, String> param) {
StringBuilder sb = new StringBuilder();
param.forEach((key, value) -> sb.append(key).append(":").append(value).append("\n"));
return sb.toString();
}
@GetMapping(value="/request3")
public String getRequestParam3(MemberDTO member){
return member.toString();
}
}
package studio.thinkground.testproject.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
public class MemberDTO {
@Setter
private String name;
@Setter
private String email;
@Setter
private String organization;
@Override
public String toString(){
return "MemeberDTO[" + this.name +
", " + this.email + ", " + this.organization + "]";
}
}