Java의 기본적인 문법을 공부하고 간단한 toy project를 만들어보고 싶었다. 그러던 와중에 패스트캠퍼스 강의에서 spring boot를 활용해서 To do Application 강의가 있었다. 마침 공부해보고 싶은 프레임워크인 Spring boot와 공부했던 java로 기능 구현이 가능했고 무엇보다 많은 오픈소스와 최소한의 구현만으로 필요한 CRUD 기능을 공부할 수 있어서 To doApplication 프로젝트로 정했다. 본 포스팅은 패스트캠퍼스 강의를 참고하여 작성했습니다
필요 기능
- Todo 리스트 목록에 아이템을 추가
- Todo 리스트 목록 중 특정 아이템을 조회
- Todo 리스트 전체 목록을 조회
- Todo 리스트 목록 중 특정 아이템을 수정
- Todo 리스트 목록 중 특정 아이템을 삭제
- Todo 리스트 전체 목록을 삭제
To do Application 아키텍처
데이터 클래스 - 데이터 클래스는 request, response, model 해당되며 기능이 없고 데이터라고 생각하면 된다.
데이터 처리 클래스 - 데이터 처리 클래스는 controller, service, jpa repository 해당되며 다양한 작업을 한다.
build.gradle
Rest Repositories, Spring Data JPA, H2 Database, Loombok 의존성 추가
plugins {
id 'org.springframework.boot' version '2.4.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
annotationProcessor("org.projectlombok:lombok")
compileOnly("org.projectlombok:lombok")
}
test {
useJUnitPlatform()
}
디렉터리 구조
TodoServerApplication
Spring Initializer가 기본으로 만들어 준 자바 파일이다. 옛날 Spring과는 다르게 main을 바로 실행시킬 수 있다. main을 실행시키면 Spring boot가 embeded tomcat을 자체적으로 실행시킴으로 Tomcat을 깔 필요가 없다.
package org.example;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;
@SpringBootApplication
public class TodoServerApplication {
public static void main(String[] args) {
SpringApplication.run(TodoServerApplication.class, args);
}
}
TodoEntity
To do Application에 모델이며 실제로 데이터베이스에 저장될 데이터이다.
package org.example.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class TodoEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 생성을 DB에 위임
private Long id;
@Column(nullable = false) // 해당 필드는 DDL 생성시 NOT NULL 조건 붙는다
private String titile; // 제목
@Column(name = "todoOrder", nullable = false) // order명은 H2DB에 예약어로 사용됨으로 name속성을 사용하여 맵핑할 컬럼이름을 지정
private Long order; // 순서
@Column(nullable = false)
private Boolean completed; // 완료 여부
}
기본적으로 웹 애플리케이션에서 사용하는 VO 객체는, DB 테이블의 column과 같은 이름의 private 변수를 가지고, getter/setter 메서드를 정의한 후 toString 메서드를 정의한다. 하지만 프로젝트가 커지면 변수, 메서드들이 늘어나며 유지보수가 힘들어진다. 이를 해결하기 위한 라이브러리가 Lombok이다.
Lombok는 자바 라이브러리로 코드를 효율적으로 작성할 수 있도록 도와주며 class명 위에 어노테이션을 명시해줌으로써 getter/setter와 같은 메서드를 작성하지 않아도 된다.
사용한 어노테이션에 대해 간단히 알아보자
- @Data - @Getter/@Setter, @ToString, @EqualsAndHashCode을 한꺼번에 설정한다.
- @Entity - 해당 클래스에 선언하면 그 클래스는 JAP가 관리하며 DB의 테이블과 Class와 맵핑 가능하다.
@Entity 제약사항(클래스 필드에 final, enum, interface, class를 사용 X , 기본 생성자가 반드시 필요)
- @NoArgsConstructor - 기본 생성자를 생성해준다.
- @AllArgsConstructor - 전체 변수를 생성하는 생성자를 만들어준다.
- @Id - JPA에서 Entity 클래스에 식별할 PK(Primary Key)를 지정한다.
- @GeneratedValue(strategy=GenerationType.IDENTITY) - 기본키 생성을 DB에게 위임하여 id값을 따로 할당하지 않아도 DB가 자동으로 AUTO_INCREMENT를 하여 기본키를 생성해준다.
기본키를 자동으로 생성할 때에는 @Id와 @GenerratedValue 어노테이션이 함께 사용되어야 한다.
- @Column - 객체 필드와 DB 테이블 컬럼을 맵핑한다.
테이블 전체가 엔티티 이고, 열 부분이 column이고 행 부분이 엔티티 객체가 된다고 생각하면 된다.
TodoRequest
웹 브라우저(클라이언트)를 통해 애플리케이션 서버에 요청하는 부분이다.
package org.example.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodoRequest {
private String title;
private Long order;
private Boolean completed;
}
리퀘스트로 서버에 보낸 정보가 모델과 똑같지 않은 경우기 많아 따로 클래스 생성
TodoResponse
http response에 포함되어 브라우저로 전달된다. model을 그대로 브라우저에 전달되는 것은 비즈니스 로직을 공개하는 것이므로 reponse 클래스를 따로 만드는 게 좋다. 보통 reponse 클래스에 부가적으로 UI가 필요한 정보와 에러 메시지 등이 들어간다.
package org.example.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodoResponse {
private Long id;
private String title;
private Long order;
private Boolean completed;
private String url;
//이후에 코드작성을 편리하게 하기위해 todoEntity 파라미터로 받는 생성자 생성
public TodoResponse(TodoEntity todoEntity){
this.id = todoEntity.getId();
this.title = todoEntity.getTitile();
this.completed = todoEntity.getCompleted();
this.order = todoEntity.getOrder();
this.url = "http://localhost:8080/" + this.id;
}
}
model을 그대로 노출하는 것이 보안에 안 좋아 직접 model인 TodoEntity 파라미터로 받는 생성자를 생성해준다. url은 TodoEntitiy의 없는 정보로 별도로 작성해준다.
하드 코딩된 문자열의 코드 내부에 들어가 있는 게 좋은 것은 아니다. 만약 base url의 주소가 바뀌면 다시 코드를 작성해야 된다. 보통 config, property 관리하는 게 좋으나 그러면 추가해야 될 작업이 많아져서 배보다 배꼽이 커질 수 있다. (사실 관리하는 방법을 자세히 모르는 이유도 있다..^^;)
데이터 처리 클래스인 controller, service, jpa repository는 다음 포스팅에서 설명하겠다.
'Spring Boot' 카테고리의 다른 글
[Spring boot] (2) Spring boot를 활용한 To do Application (0) | 2022.02.08 |
---|