먼저 , intelliJ에 아래와 같이 spring프로젝트를 생성한다.
처음 Application을 실행하면 아래와 같은 오류가 뜨게 된다.
이는 데이터베이스를 사용하기 위한 dependency가 존재하는 경우 @SpringBootApplication 에서 자동으로 데이터베이스 값을 설정하려고 시도하지만 사용자는 데이터베이스 값을 입력을 안했기에 발생하는 에러이다.
따라서 해결방법으로 직접 DB를 넣어주거나
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/bootex
spring.datasource.username=bootuser
spring.datasource.password=bootuser
//application.properties 에 추가
implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client'
// build.gradle 의 dependencies에 추가
DB를 사용하지 않는 방법도 있다.
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
지금부터 할 예제는 간단한 예제이므로 DB를 사용하지 않고 진행한다.
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Controller를 아래와 같이 생성해준다.
@RestController
@RequestMapping("api")
public class DemoController {
}
@RestController를 사용하여 진행하며, @RequestMapping 클래스 지정으로 url로 api를 매핑하게 한다.
간단하게 화면에 문자열을 출력하는 API를 만들어 본다.
@RestController
@RequestMapping("api")
public class DemoController {
@RequestMapping("demoPage")
public String getRequest(){
return "context...";
}
}
아래와 같이 출력되는 것을 확인할 수 있다.
@RequestMapping
URL을 컨트롤러의 메서드와 매핑할 때 사용하는 스프링 프레임워크의 어노테이션이며 클래스나 메서드 선언부에 @RequestMapping과 함께 URL을 명시하여 사용
@RequestMapping은 method파라미터는 어떤 요청으로 받을지 정의하게 된다.
@RestController
@RequestMapping("api")
public class DemoController {
@RequestMapping(method= RequestMethod.GET, value="demoPage") // GET 요청시 받는다
public String getRequest(){
return "context...";
}
}
위는 method=RequestMethod.GET으로 GET 요청시 받는것을 의미한다. POST요청은 GET을 POST로 바꿔주면 되며, 둘다 사용할 경우
@RequestMapping(value="/", method = {RequestMethod.GET, RequestMethod.POST})
위와 같이 설정해도 된다.
직접 @GetMapping을 써보자
@RestController
@RequestMapping("api")
public class DemoController {
@RequestMapping(method= RequestMethod.GET, value="demoPage")
public String getRequest(){
return "context...";
}
@GetMapping("demoPage2") // 위와 똑같음
public String getRequest2(){
return "context...";
}
}
위의 getRequest와 getRequest2 메서드는 같은 역할을 한다고 볼 수 있다.
Parameter를 입력받는 API를 만드는 경우도 있는데, 그때는 @RequestParam을 사용한다.
@GetMapping("demoPage3")
public String getRequest3(@RequestParam String id,
@RequestParam(name = "password" ) String pwd){
return "ID: " + id + " , Password: " + pwd;
}
위 코드와 같이 입력 받을 파라미터를 메소드의 인자값으로 넣어준다. 그리고, 그앞에 @RequestParam을 넣는다.
기본적으로 인자 변수명을 파라미터명으로 받는다.
하지만, @RequestParam(name="원하는 파라미터 명")을 이용하면, 파라미터명을 바꿀 수 있다.
만약, 파라미터가 많아진다면 VO객체를 생성하여 받을수도 있다.
VO객체
도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체
예를 들어, 프로그래밍할 때, 사물을 복합물로 표현하는 것이 유용한 경우가 종종 있다.
x, y로 이루어진 2차원 좌표를 표현하거나, 숫자와 통화로 이루어진 금액, 시작 날짜와 끝 날짜로 이루어진 날짜 기간 등이 있다. 이렇게 집합체 자체를 하나로 묶어서 VO객체로 표현한다.
public class SearchParamVO {
private String username;
private String email;
private int page;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
@Override
public String toString() {
return "SearchParamVO{" + "username='" + username + '\'' + ", email='"
+ email + '\'' + ", page=" + page + '}'; }
}
위와 같이 VO클래스를 작성한 뒤 컨트롤러에 넣어준다.
@GetMapping("demoPage4")
public String getRequest4(SearchParamVO VO){
SearchParamVO V = new SearchParamVO();
V.setUsername("LSH");
V.setEmail("777@naver.com");
V.setPage(3);
return V.toString();
}
위와 같이 출력되는 것을 볼 수 있다.
위에서는 계속 문자열을 반환했지만, 요즘 API는 대부분 JSON 형식을 사용한다.
JSON 형식으로 변환하는 것은 return 값을 VO 객체로 해주면, Jackson 라이브러리가 알아서 JSON 형태로 변환하여 응답해준다.
@GetMapping("demoPage4")
public SearchParamVO getRequest4(SearchParamVO VO){ // return 값을 VO객체로 변경
return VO;
}
여기서 Jackson 라이브러리는 @RestController 내부적으로 있는 라이브러리이다. 만약 @RestController가 아닌 @Controller를 사용한다면, @ResponseBody를 추가해줘야 한다.
'코드로 배우는 스프링부트 웹 프로젝트' 카테고리의 다른 글
Springboot) RedirectAttributes, addFlashAttribute() (0) | 2022.01.17 |
---|---|
Springboot) @PostMapping (0) | 2022.01.11 |
Springboot) JPA에서 M:N(다대다) 처리 (2) , @EntityGraph (0) | 2022.01.07 |
Springboot) JPA에서 M:N(다대다) 처리 (1) , N + 1 문제 (0) | 2022.01.03 |
Springboot) @Controller와 @RestController의 차이 (0) | 2021.12.28 |