간단하게 처음부터 스프링부트 프로젝트를 만들어보고 테스트 해보되,
평소에 별 생각없이 사용했거나 살짝 헷갈리는 부분을 더 세세하게 정리해보았다.
인텔리제이의 Spring Initializr로 프로젝트 시작.
언어는 Java
.
Type 옵션에선 사용할 빌드 도구를 선택한다.
빌드 도구란 소스 코드를 실행 가능한 어플리케이션으로 만들어주는 작업을 자동화 시켜주는 도구이다.
Maven
vs Gradle
은
gradle
이 우수.같은 차이점이 있음. 오래된 프로젝트가 아니면 gradle을 쓰는 추세이고,
gradle Kotlin
vs gradle Groovy
은
kotlin
은 ide에서 자동완성이나 오류밑줄 표시 등을 지원 kotlin
은 자바 8이상부터 지원. 의 차이가 있다. 점점 kotlin
이 조금씩 대세가 되어가는 중이지만 이전 프로젝트는 대부분 groovy기반 이었기 때문에 kotlin을 쓰는건 다음으로.
jdk, java 버전은 설치되어 있는 버전으로 하였다.
사용한 dependency는 다음과 같다.
(db연결은 나중에 테스트 해보려 하므로 여기에서 Srping Data JPA, MySQL Driver, Spring Data MongoDB는 일단 제외.)
아파치(Apache) : 가장 많이 쓰이는 웹 서버 중 하나.
톰캣(Tomcat) : 아파치 재단에서 만든 웹 어플리케이션 서버(WAS). 자바 서블릿을 실행시키고, JSP가 포함되어 있는 웹페이지를 만듬.
웹 서버는 클라이언트의 요청을 받아 처리한다. 정적인 컨텐츠(html, css, js)는 직접 처리하고, 동적인 컨텐츠는 WAS에게 넘겨준다. 사실 WAS는 웹 서버의 역할도 할 수 있으나 그 부담을 줄이고 WAS가 클라이언트에게 직접 노출되는 것을 막기 위해 웹 서버와 WAS를 같이 사용한다.
MySQL Driver나 Spring Data MongoDB는 db와 연결할 때 필요한 드라이버들.
Dependency 쪽은 여러 곳을 참고했으나 특히 여기를 많이 참고 : https://appleg1226.tistory.com/11
@RestController
@RequestMapping("api/v1/simple")
public class SimpleController {
@Autowired
SimpleService simpleService;
@GetMapping("/hellow/{hellow}")
public ResponseEntity<String> answerMePlease(@PathVariable String hellow){
String answer = simpleService.answerMePlease(hellow);
if(answer == null || answer.length() == 0){
return ResponseEntity.status(400).body("something woring");
}
return ResponseEntity.status(200).body(answer);
}
}
간단하게 만든 Controller. Request나 Response가 복잡하면 따로 이를 위한 클래스를 만들어 주는 것이 좋으나 지금은 간단하게 하는 것이니 생략.
간단하게 문자열 받아서 HI를 덧붙여서 되돌려주는 API.
@RestController vs @Controller:
- Controller는 주로 View를 반환하기 위해 사용. Data를 반환하기 위해선 메서드에
@ResponseBody
를 붙인다.- RestController는 자동으로
@ResponseBody
가 붙음. 즉 주로 Data를 반환하기 위해 사용.
@PathVariable vs @RequestParam
둘다 주소값에 붙어서 전달되는 변수를 받아오기 위해 사용.
- @PathVariable의 경우
- "/경로1/경로2/{
PathVariable1
}/{PathVariable2
}" 의 형태.- 경로 하나에(슬래시 하나에) 하나만.
- @RequestParam의 경우
- "/경로1/경로2?
RequestParam1
=값1
&RequestParam2
=값2
" 의 형태- 공통적으로
- 여러개일 경우 Map으로 받아올 수 있음.
- 변수 이름과 같으면 자동으로 바인딩. 이름이 같지 않아도 바인딩 될 변수 이름을 명시하는 방법도 가능.
- required 옵션을 true로 하면 필수.
@Service
public class SimpleService {
public String answerMePlease(String hellow){
return hellow + "-> HI!";
}
}
간단하게 Service도 만들어서 실제 로직 구현.
어노테이션 관련 참고 : https://velog.io/@rara_kim/Spring-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98Annotation
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
테스트를 위해 Swagger를 사용하기로 했다.
Swagger를 사용하기 위해 필요한 Dependency를 추가하고
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.components(new Components())
.info(apiInfo());
}
private Info apiInfo() {
return new Info()
.title("API Test") // API의 제목
.description("Let's practice Swagger UI") // API에 대한 설명
.version("1.0.0"); // API의 버전
}
}
@Configuration
으로 설정 클래스를 만들었다.
Swagger 세팅 출처 :
https://velog.io/@gmlstjq123/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-Swagger-UI-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0
어플리케이션을 실행하고
http://localhost:8080/swagger-ui/index.html 에 접속하면
테스트 해 볼 수 있는 Swagger 페이지를 확인할 수 있다.
스크린샷을 찍는 걸 잊었지만 원하는 대로 입력한 문자열에 HI를 덧붙인 문자열이 반환된다.
빌드도구/Dependency/어노테이션... 뭔가 자꾸 덧붙여서 적다보니 글이 지저분하다. 그렇다고 하나하나 떼서 따로 다른 글에 정리해서 쓰는건 어렵다. 다른 것보다 글 쓰는 연습부터 해야될 듯. 이 글도 나중에 다시 정리해야겠다.