포스트

REST API(1) Project 만들기

공부 배경

이전에 REST API란 무엇인가?에 대한 글을 적으면서 직접 REST API를 만들어 보고 싶었다. Inflearn에 있는 백기선 개발자님의 스프링 기반 REST API 개발강의를 보면서, 직접 만들어 보면서 다시한번 개념을 정리해 보겠다.


Spring Initializr

start.spring.io를 통해 프로젝트를 만들고 의존성을 추가해 준다.
image

start.spring.io에서는 현재 SpringBoot 3.2.2 버전을 권장한다. 이전에 이 최신 버전으로 프로젝트를 만들어 강의를 따라가다 보니, 상속받는 클래스나 인터페이스명이 바뀌거나 deprecated된 것도 많고, 그래서 이를 해결하고자 공식문서 보거나 구글링을 통해 고치니 시간도 오래걸리고, 결국 한계에 부딪혔다. 완전한 REST API를 만들고 공부하자는 목표와 멀어지고 있는 것 같아 다음 처럼 강의 내용과 같이 버전을 바꾸어 주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.0.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>me.hantomas</groupId>
	<artifactId>rest-api</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>rest-api</name>
	<description>REST API for Spring</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-hateoas</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.restdocs</groupId>
			<artifactId>spring-restdocs-mockmvc</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.asciidoctor</groupId>
				<artifactId>asciidoctor-maven-plugin</artifactId>
				<version>2.2.1</version>
				<executions>
					<execution>
						<id>generate-docs</id>
						<phase>prepare-package</phase>
						<goals>
							<goal>process-asciidoc</goal>
						</goals>
						<configuration>
							<backend>html</backend>
							<doctype>book</doctype>
						</configuration>
					</execution>
				</executions>
				<dependencies>
					<dependency>
						<groupId>org.springframework.restdocs</groupId>
						<artifactId>spring-restdocs-asciidoctor</artifactId>
						<version>${spring-restdocs.version}</version>
					</dependency>
				</dependencies>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

아래와 같이 parent에 SpringBoot 버전을 <version>2.1.0.RELEASE</version>로 바꾸어 주었다. 이렇게 하면 SpringBoot가 의존성으로 추가한 것의 버전들을 알아서 관리해준다고 한다.

1
2
3
4
5
6
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

Java 버전 또한 11버전으로 바꾸어 주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <!--<scope>test</scope>-->
</dependency>

lombok<optional>true</optional>는 혹시라도 다른 프로젝트에서 이 프로젝트를 참조할 때, 이 lombok같이 들어가지 않게 해주는 것이라고 한다.
그리고 이 프로젝트에서는 실제 DB 는 PostgreSQL을 사용하고, 테스트용 DB로는 H2를 사용한다. 이를 분리하는 이유는 추후에 설명할 예정이다.
일단, H2 테스트 스코프이기 때문에, 실제 프로젝트 실행중에는 사용되지 않는다. 테스트를 실행할 때만 사용된다. 현재는 테스트가 없기 때문에 이렇게 <!--<scope>test</scope>--> 주석 처리하여 프로젝트가 잘 돌아가는지 확인한다.
이렇게 두 가지 DB가 사용되는 경우에는 인메모리(In-Memory = Main Memory라고도 부른다.) DB인 H2가 사용이 된다.
image


Project 정상 수행 확인

image

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.