• yundream
  • 2020-07-19 10:39:24
  • 2020-07-12 16:19:56
  • 10916

Contents

ToDo List

ToDo 리스트를 관리하는 애플리케이션을 만들어보려고 한다. Java는 문외한이니 많은 걸 기대하지는 말자. Intellij도 익숙하지 않은 몸이다. 공부 과정의 기록으로 보면 되겠다.

개발 환경

  • 우분투 리눅스 20.04
  • Intellij ULTIMATE 2020.1. 아직 구독하지 않고 있다. 구독할까 말까 고민 중이다. vim-go 를 이용한 golang이 주력이고, java를 계속 할지는 아직 확신이 없어서.
  • Openjdk version 1.8.0_252

Spring Initializr

Spring Initializr 사이트에서 Gradle Project 를 만들었다.

 Gradle initializr

  • Project : Gradle Project 를 선택했다. 이유는 XML을 싫어해서.
  • Languate : Java. Kotlin을 해보고 싶지만 일단은.
  • Spring Boot : 스냅샷(Snapshot) 버전은 선택하지 말라고해서 2.3.1 을 선택
  • Project Metadata : Group 이름은 co.kr.joinc로 했다. Name은 Todo
  • Java : 버전 8
  • Dependencies : RESTful API를 만드는게 목적인지라 Spring Web을 선택했다. 자바 어노테이션을 도와준다고 해서 LomBok를 선택했다. 이번 연습에서는 데이터베이스를 다루지 않을 거라 JPA는 넣지 않기로 했다.
Generate 버튼을 누르면 프로젝트 파일을 다운로드 한다. 작업 디렉토리는 $HOME/workspace 다.
# mv Todo.zip ~/workspace/
# cd ~/workspace 
# unzip Todo.zip

아래와 같은 프로젝트 구조가 만들어졌다.
.
├── HELP.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── co
    │   │       └── kr
    │   │           └── joinc
    │   │               └── Todo
    │   │                   └── TodoApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── co
                └── kr
                    └── joinc
                        └── Todo
                            └── TodoApplicationTests.java
build.gradle 내용이다.
plugins {
    id 'org.springframework.boot' version '2.3.1.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'co.kr.joinc'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}
크게 이해하기 어려운 부분은 없는 것 같다. 생소한 부분만 따로 찾아봤다.
  • annotationProcessor : Annotation Processor란 애노테이션에 대한 코드베이스를 검사, 수정 혹은 생성하는데 사용한다. java 컴파일러의 플러그인의 일종이다. 애노테이션을 잘 사용하면 개발자의 코드를 단순화 할 수 있다고 한다.

main 메서드

main 메서드다. 파일이름은 TodoApplication.java 다.
package co.kr.joinc.Todo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TodoApplication {

	public static void main(String[] args) {
		SpringApplication.run(TodoApplication.class, args);
	}
}
@springBootApplication 은 @Configuration, @EnableAutoConfiguration, @ComponentScan 어노테이션을 사용하는 것과 같다. @Configuration 어노테이션은 개발자가 만든 클래스를 Bean 으로 생성 할 때 Singleton으로 한번만 생성되도록 한다. @Component는 Bean을 만들 때 new로 생성하듯이 생성한다. @ComponentScan은 @Component와 @Configuration 어노테이션이 붙은 class를 스캔해서 Bean으로 등록한다.

SpringApplication.run 을 이용해서 TodoApplication 을 실행한다.

최초 컨트롤러를 만들어보자.

controller 패키지를 만들고 여기에 controller를 배치하기로 했다. 첫번째 만들 컨트롤러는 /ping 으로 애플리케이션이 작동중인지 테스트하는 목적으로 사용한다. co.kr.joinc.Todo.controller.ping 패키지를 만들었다. 여기에 PingController를 만들었다.
package co.kr.joinc.Todo.controller.ping;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PingController {
    @GetMapping("/ping")
    public String Ping() {
        return "pong";
    }
}
GET /ping을 호출하면 "pong"를 리턴한다.

패키지 구성은 아래와 같다.
co.kr.joinc.Todo.
                ├── TodoApplication.java
                └── controller
                    ├── README.md
                    └── ping
                        └── PingController.java

애플리케이션을 빌드하고 테스트했다.
# curl -XGET localhost:8080/ping       
pong

정리

2-3년간 Go 언어를 이용해서 API를 개발했떤 경험에 비추어서 spring 사용기를 정리한다. 이건 어디까지나 첫 인상이다.
  • 일단 내 취향에는 맞지 않다. : 숨겨진게 너무 많다. Go는 그냥 설치해서 5개 이내의 키워드로 즉시 애플리케이션을 개발 할 수 있었다. Java는 뭐랄까 IDE 설정하는 것 부터 허들이었다.
  • 드러나지 않은 것들, 암시적인 것들이 있다. Go는 구체적이고 직관적이었다. 이는 달리 말하자면 Go의 경우 개발자가 좀더 귀찮아 질 수 있다는 것을 의미 할 것이다. 다른 자바 개발자들에게 왜 이리 "복잡해 보이느냐" 라고 물어 봤을 때 그들의 대답은 좀 만 더 사용해 보면 엄청 편할 거라고 했다.
  • 어노테이션, Bean, DAO ?, DTO ?, JPA ?, Hibernate ?, XML, 데이터베이스 연동하는 간단한 애플리케이션 하나 짜는데 뭐 이렇게 걸리는게 많은지. 뜯어보면 Go언어로 만드는 것과 구조적으로 차이가 없기는 했다.
  • 이를테면 Go로 만든 프로그램은 그냥 보면 이게 뭐 하는 코드인건지 단박에 알아낼 수 있는데, 자바는 한참을 봐도 이해를 할 수 없었다.
  • 개발환경의 답답함 : go는 vim 으로 개발해도 불편함이 없었는데, 작업 내용이 즉시 반영이 됐다. 빠른 반응 속도라고 해야 하나. 지금 사용하고 있는 인텔리제이는 매우 답답했다. 키 입력이 밀리는 느낌.
  • 테스트 & 배포가 복잡 할 것 같은 불안한 느낌이 든다.
어쨋든 하기로 했으니, 하긴 해야 할 것 같다. 다음 번에 할 일은 아래와 같다.
  • JSON 데이터를 반환한다.
  • JPA를 이용해서 H2 데이터베이스를 연동해서 ToDo 데이터를 읽고쓰는 API를 개발한다.
Spring Boot REST API 서버 만들기 2 - JPA