철학과 학생의 개발자 도전기
[Spring] 스프링 부트와 AWS 스터디 - 1주차 본문
스터디 시작
현재 GDSC동아리에서 스프링 스터디를 진행중이다. 저번 스터디까지 '스프링 입문' 무료 강의로 공부를 했고, 앞으로는 책으로 진행할 예정이다. 같이 공부할 책은 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 이다.
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - YES24
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - YES24
가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다. 경험이 실력이 되는 순간!이 책은 제목 그대로 스프링 부트와 AWS로 웹 서비스를 구현한다. JPA와 JUnit 테스트, 그레이들, 머스테치, 스프링
www.yes24.com
01장은 프로젝트 생성과 설정, 인텔리제이에서 git을 연결하는 방법 등이라 굳이 정리하지 않아도 될 것 같다.
02장 스프링 부트에서 테스트 코드를 작성하자
테스트 코드
테스트 코드를 작성하는 것은 매우 중요하다.왜냐하면 빠른 피드백이 가능하기 때문이다.
테스트 코드가 없다면 코드의 작동을 눈으로 검증하기 위해 서버를 실행시키고 API 테스트 도구로 HTTP 요청을 보내는 등 번거로운 과정을 거쳐야 하지만 테스트 코드를 작성하면 자동으로 코드의 정상작동을 검증할 수 있다.
또한 새로운 기능을 추가하더라도 기존 기능이 잘 작동하는지 테스트 코드를 통해 확인할 수 있다.
Java에서 단위 테스트는 주로 JUnit을 사용한다.
롬복
롬복은 자바 라이브러리로 개발자들이 자주 사용하는 Getter, Setter, 기본 생성자 등을 어노테이션으로 자동 생성해준다.
기존 코드를 롬복으로 교체한 후에도 잘 작동하는지 확인하려면 앞서 얘기한 테스트 코드를 활용하면 편리하다.
테스트를 진행할 때는 assertj라는 테스트 검증 라이브러리의 assertThat 메소드를 활용한다. 메소드 체이닝이 지원되어isEqualTo() 등의 메소드를 연속해서 사용할 수 있다. JUnit도 assertThat을 지원하지만 assertj를 사용하는 이유는 추가 라이브러리가 필요없고 자동완성이 더 잘되기 때문이다.
03장 스프링 부트에서 JPA로 데이터베이스 다뤄보자
JPA는 객체와 DB 테이블을 맵핑해주는 인터페이스로 자바 표준 ORM이다.
인터페이스이기 때문에 Hibernate 등의 구현체가 필요하다. 스프링에서 SpringDataJpa를 사용할 수 있는데 이는 구현체의 교체, 저장소의 교체를 편리하게 만든다. 코드를 일일이 수정할 필요없이 설정만 바꿔주면 되기 때문이다.
도메인 패키지에 Posts 클래스를 예시로 보자.
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.springboot.domain.BaseTimeEntity;
import javax.persistence.*;
@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}
어노테이션에 대한 이해가 중요하므로 정리하면 다음과 같다.
- @Entity: DB테이블과 연결되는 클래스
- @Id: pk필드
- @GeneratedValue: pk생성규칙
- @Column: 선언하지 않아도 컬럼이 되지만 옵션을 바꿀 때 사용
- @NoArgsConstructor: 기본 생성자 자동추가
- @Getter: 클래스 내 모든 필드의 Getter 메소드 생성
- @Builder: 빌더 패턴 사용
참고로 엔터티에 Setter를 사용해서 값을 넣으면 안된다. DB에 값을 최초로 삽입할 때는 생성자를 이용하고, 이후에는 서비스에서 이벤트에 맞는 public 메소드를 호출해서 값을 수정해야한다. 그래야 시스템이 복잡해지더라도 값의 변경을 명확하게 추적할 수 있다.
스프링 레이어
- Web Layer: 컨트롤러, 뷰 탬플릿
- Service Layer: 트랜잭션, 도메인 간 순서 보장
- Repository Layer: DB접근
- Dtos: 계층 간 데이터 교환을 위한 객체
- Domain Model: 도메인과 관련된 객체
저자는 도메인 모델에서 비즈니스 로직을 구현해서 메소드로 만들고, 서비스 레이어에서 메소드를 순서에 맞게 실행해야 한다고 강조한다.
생성시간/수정시간 자동화
JPA Auditing을 활용하면 생성시간과 수정시간을 DB 컬럼에 자동으로 추가할 수 있다.
이를 위해 BaseTimeEntity 클래스를 만든다.
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
마찬가지로 어노테이션에 대해 정리하면 다음과 같다.
- @MappedSuperclass: BaseTimeEntity를 상속할 때 createdDate와 modifiedDate도 컬럼으로 인식
- @EntityListeners(AuditingEntityListener.class): Auditing 기능 추가
- @CreatedDate: 생성시간 자동저장
- @LastModifiedDate: 변경시간 자동저장
앞으로 할 일
다음 스터디까지 3장을 더 공부해오면 된다.
- 로그인 기능 구현
- AWS EC2 환경 구성
- AWS RDS 환경 구성
스프링 부트 내용은 로그인 기능 구현에서 마무리되고, AWS를 이용해 프로젝트를 배포하기 위한 준비를 하게 된다.
나는 로그인 기능까지 공부한 후에 CRUD와 로그인 기능을 다른 팀 프로젝트에서 활용해보고 싶다.
'Spring' 카테고리의 다른 글
[Spring] 스프링 부트와 AWS 스터디 - 2.5주차 (0) | 2022.12.02 |
---|---|
[Spring] 스프링 부트와 AWS 스터디 - 2주차 (0) | 2022.12.02 |
[Spring] 스프링 입문 - 후기 (0) | 2022.11.05 |
[Spring] 스프링 입문 - 섹션 6. 스프링 DB 접근 기술 (0) | 2022.11.05 |
[Spring] 스프링 입문 - 섹션 5. 회원 관리 예제 - 웹 MVC 개발 (0) | 2022.10.09 |