Springboot RESTFul API 서버 20분만에 환경설정 끝내기
Springboot RESTFul API 서버 20분만에 환경설정 끝내기
보다 쉽고! 보다 간편하게!
RESTFul API 환경을 설정해보겠습니다.
Java Version : 1.8
Springboot Version : 2.2.1
DB Version : Oracle 12c
우선 Springboot Gradle 프로젝트 생성은 아래의 Link를 참고하세요.
Link : Eclipse Spring boot Gradle 프로젝트 간단 생성 방법
1분이면 Springboot 프로젝트가 생성됩니다.
이제 API 서버를 만드는데 필요한 라이브러리를 의존성 주입해줍니다.
(build.gradle > dependencies 내에 아래 코드 추가 후 Refresh Gradle )
/*Web*/
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.2.0.RELEASE'
/*Mybatis*/
compile group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '2.1.1'
compile('org.springframework.boot:spring-boot-starter-jdbc')
위에 이미지를 보시면 아시겠지만 libs 폴더에는 ojdbc6.jar 만 존재합니다. (구글링해서 넣어주세요.)
이제 DB 접속을 위한 mybatis 설정을 합니다. (기본패키지.config 에 추가)
package com.tistory.aljjabaegi.api.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan(
basePackages = "com.tistory.aljjabaegi.api.mapper",
sqlSessionFactoryRef = "sqlSessionFactory"
)
public class MybatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource, ApplicationContext applicationContext) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMapperLocations(applicationContext.getResources("classpath*:com/tistory/aljjabaegi/api/mapper/*.xml"));
factory.setTypeAliasesPackage("com.tistory.aljjabaegi.api.domain");
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setJdbcTypeForNull(null);
configuration.setCacheEnabled(false);
configuration.setMapUnderscoreToCamelCase(true);
factory.setConfiguration(configuration);
return factory.getObject();
}
}
후에 application.properties 에 DB 연결을 위한 정보를 입력해주세요.
# DB
spring.datasource.url=jdbc:oracle:thin:@오라클ip:오라클port:접속할sid
spring.datasource.username=이름
spring.datasource.password=비밀번호
이제 DB연결까지, RESTFul API를 개발하기 위한 기본적인 환경설정은 되었습니다.
(DB연동 없이 테스트 하시고 싶으신 분들은 config파일과 패키지를 추가 안하셔도 됩니다.)
MVC 패턴으로 Mapper와 Service impl, Service, Controller 를 구현합니다.
구조는 아래의 이미지를 참고하세요.
[Controller]
package com.tistory.aljjabaegi.api.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.tistory.aljjabaegi.api.service.ApiService;
@RestController
@RequestMapping("/api/v1")
public class ApiController {
@Autowired
ApiService apiServer;
@GetMapping("/members")
public String getMember() {
String member = null;
try {
member = apiServer.getMember();
} catch (Exception e) {
member = "없음";
}
return new String("Member 조회 : "+member);
}
@PostMapping("/members")
public String addMember() {
return new String("Member 추가");
}
@PutMapping("/members")
public String modMember() {
return new String("Member 수정");
}
@DeleteMapping("/members/{id}")
public String delMember(@PathVariable("id") String id) {
return new String("Member 삭제 : id"+id);
}
}
[Service]
package com.tistory.aljjabaegi.api.service;
public interface ApiService {
public String getMember() throws Exception;
}
[Service impl]
package com.tistory.aljjabaegi.api.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.tistory.aljjabaegi.api.mapper.RestMapper;
import com.tistory.aljjabaegi.api.service.ApiService;
@Service
public class ApiServiceImpl implements ApiService{
@Autowired
RestMapper mapper;
@Override
public String getMember() throws Exception {
return mapper.getMember();
}
}
[Mapper]
package com.tistory.aljjabaegi.api.mapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RestMapper {
public String getMember();
}
[Mapper xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.tistory.aljjabaegi.api.mapper.RestMapper">
</mapper>
Controller를 보시면 메소드별로 어노테이션(@)이 구분되어 있는 것을 보실 수 있습니다.
이처럼 RESTFul API 에서는 도메인 상에 select, insert, update, delete를 사용하지 않고
HTTP 메소드로 기능을 분리해야 합니다.
GetMapping - 조회
PostMapping - 추가
PutMapping - 수정
DeleteMapping - 삭제
도메인 설계 시 주의하여야 할 점은,
동사나 형용사를 사용하지 말고 복수명사를 사용하도록 해야합니다.
예) getMember(x), members(O)
그리고 하위 Resource 는 관계설정을 위해서만 사용합니다.
예를들어 사번이 137인 사원의 정보를 제공해주는 API 라면
/member/137 과 같이하고
사번이 137인 사람의 주소정보를 제공해야 한다면
/member/137/address
와 같이 설계 하여야 합니다.
이 외에도 기본적인 페이징, 복수필터, 정렬등도 포함하여 설계하는 것이 좋습니다.
Link : SpringBoot jersey2-grizzly2-swagger RESTful API example REST api 서버 개발