Programing/Springboot

Springboot RESTFul API 서버 20분만에 환경설정 끝내기

리커니 2019. 11. 8. 14:17
반응형

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 프로젝트 간단 생성 방법

 

Eclipse Spring boot Gradle 프로젝트 간단 생성 방법

Eclipse Spring boot Gradle 프로젝트 간단 생성 방법 원래는 간단 합니다. 이클립스 좌측 Project Explorer 에서 오른쪽 마우스 클릭. New > Other... > Spring > Spring Starter Project 선택. 해서 버전만 선택..

aljjabaegi.tistory.com

 

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 서버 개발

 

반응형