스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - JPA

lacblueeun·2020년 12월 14일
0

springboot

목록 보기
4/17
post-thumbnail

🧊 국내에서는 아직 myBatis를 많이 사용하지만, 자사 서비스를 개발하는 곳에서는 SpringBoot 와 JPA를 전사 표준으로 사용하고 있다. 그 외 나머지 기업들도 기존 프로젝트 환경을 개편하면서 대부분 JPA를 선택하고 있다.

1. JPA

개발자는 객제치향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행한다. 개발자는 항상 객체지향적으로 코드를 표현할 수 있으니 더욱 SQL에 종속적인 개발을 하지 않아도 된다.

관계형 데이터베이스가 계속해서 웹 서비스의 중심이 되면서 모든 코드는 SQL 중심이 되었다. 현업 프로젝트 대부분이 애플리케이션 코드보다 SQL로 가득하게 됐다. 프로젝트를 하면서 SQL문을 작성하면서 많은 시간을 소모했던 것을 생각해보면 공감이 간다! 😸

2. JPA 사용하기

2-1 환경설정

spring-boot-starter-data-jpa : 스프링 부트 버전에 맞춰 자동으로 JPA관련 라이브러리들의 버전을 관리해준다.
h2 : 별도의 설치가 필요없다. 애플리케이션을 재시작할 때마다 초기화되기 때문에 테스트 용도로 많이 이용한다.

2-2 도메인 생성하기

도메인 패키지는 도메인을 담을 패키지이다. 도메인이란 게시글, 댓글 등등 소프트웨어에 대한 요구사항 혹은 문제영역을 포함한다. 기존의 MyBatis에서 dao 패키지(쿼리의 결과만을 담던 역할)와는 조금 다르다.
도메인 주도 개발에 대한 궁금증이 생겼다. 스프링부트를 조금 더 이해하게 되면 공부하도록 해야겠다.

@Entity : 테이블과 링크될 클래스임을 나타낸다. 기본값으로 클래스의 카멜케이스 이름을 언더스코어(_)으로 테이블 이름을 매칭한다.
@Id : 해당 테이블의 PK필드를 나타낸다.
@GeneratedValue : PK의 생성규칙을 나타낸다. 스프링 부트 2.0부터는 GeneratedType_IDENTITY 옵션을 추가해야만 auto_increment 가 된다.
@Column : 테이블의 컬럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모든 컬럼이 된다. 사용이유는 기본값 외에 필요한 옵션을 사용하기 위해서이다.

🔑 Entity 클래스에서는 절대 Setter 메소드는 선언하지 않는다. 대신 해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만 한다.

값 변경이나 DB에 삽입 할 때에는 @Builder 를 통해 제공되는 빌더 클래스를 사용한다.

3. JPA CRUD API 작성하기

3-1 Spring 웹 계층

  1. Web 계층 : 컨트롤러와 JSP/Freemarker 등의 뷰 템플릿의 영역
  2. Service 계층 : @Service에 사용되며, Dao와 Controller의 중간 영역에서 사용된다.
  3. Repository 계층 : Database와 같이 데이터 저장소에 접근하는 영역
  4. Dtos(Data transfer Object) 계층 : 계층 간에 데이터 교환을 위한 객체를 이야기하며 뷰 템플릿에서 사용할 객체 등을 말한다.
  5. Domain Model : 비즈니스 처리를 담당하며, 객체 또는 데이터베이스의 테이블과 관계가 있는 것이다.

3-2 JPA Repository

JPA에서 Repository는 MyBatis등에서 Dao라고 불린다.
인터페이스로 생성하고, JpaRepository<Entity 클래스, PK타입> 을 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다. 주의할 점은 Entity 클래스와 Repository는 함께 위치해야 한다.

스프링에서는 @Autowired 방식을 많이 사용했지만, 권장하는 방식은 아닙니다. 가장 권장하는 방식은 생성자로 주입 받는 방식입니다.
바로 @RequeiredArgsConstructor 로 final이 선언된 모든 필드를 인자값으로 하는 생성자를 대신 생성해준다.

Controller와 Service에서 사용할 Dto 클래스는 Entity와 거의 유사하다. 하지만 Entity 클래스를 Request/Response 클래스로 사용해서는 안된다.

✨ JPA를 통해 게시물을 등록하는 API를 구현했다. 읽기와 삭제 및 수정은 비슷한 작업이므로 생략하도록 한다. Springboot를 게시판 만드는 작업을 통해 구조와 동작을 이해할 수 있었다.

profile
Go for Frontend Developer 🧪

0개의 댓글