패스트캠퍼스 챌린지

패스트캠퍼스 환급 챌린지 14일차 : 9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online 강의 후기

ssoonearth 2025. 4. 14. 23:27

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://abit.ly/lisbva

 

 

 

 

 

패스트캠퍼스의 '9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online' 강의 수강 14일차!
오늘은 커뮤니티 피드 서비스 프로젝트에 MySQL 연동과 환경 구축 및 JPA를 이용한 유저 엔티티 작성 작업을 진행하였다.

 

먼저 MySQL을 설치한 후, 프로젝트의 build 설정 파일에 아래 의존성을 추가하였다.

runtimeOnly("com.mysql:mysql-connector-j")

 

 

그리고 resources 디렉토리 하단에 application.yml 파일을 생성하고, spring과 jpa에 대한 설정을 했다.

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/community_feed
    username: root
    password:

  jpa:
    show-sql: true
    hibernate:
      /* ddl-auto: DB 테이블을 어떻게 생성/수정/삭제할지 설정하는 옵션
      	 update 옵션은 기존 테이블을 필드 기준으로 자동 업데이트하기 때문에
         데이터 손실의 위험이 있어 실무에선 사용하면 안된다. */
      ddl-auto: update
    properties:
      hibernate:
        format_sql: true
        
    /* DB 연결을 위해선 스레드가 필요한데, 요청마다 스레드를 생성하면 비용이 많이 들기 때문에
       spring은 DB 연결을 위한 스레드를 미리 만들고 사용이 완료되면 스레드풀로 반납하는 방식으로 사용한다.
       open-in-view 설정이 true일 경우, DB 작업이 다 끝나도 응답이 컨트롤러를 통해
       유저에게 반환될 때까지 스레드를 반납하지 않기 때문에 스레드풀의 스레드가 쉽게 부족해질 수 있다. */
    open-in-view: false

 

전에 개인 프로젝트를 진행할 때 application.properties 파일로 설정 정보를 작성했었는데, 개인적으로는 yml이 들여쓰기가 가능해서 그런지 더 가독성이 좋다고 느꼈다.

 

 

이렇게 설정 작업을 완료한 후 데이터베이스와 제대로 연결이 되었는지 확인하기 위해 어플리케이션을 실행했는데, 에러가 발생했다.

Parameter 0 of constructor in org.fastcampus.user.application.UserService required a bean of type 'org.fastcampus.user.application.interfaces.UserRepository' that could not be found.

 

Spring이 UserSerive를 생성할 때, 생성자의 첫 번째 파라미터인 UserRepository 타입의 bean을 찾지 못해서 발생한 에러이다.

다행히(?) 이전에 프로젝트를 진행하면서 종종 만났던 에러였기에, 일단 UserRepository 인터페이스를 구현하는 클래스(UserRepositoryImpl)를 생성하여서 처리할 수 있었다.

근데 강의에서는 별 문제 없이 제대로 실행되던데 어떻게 된 걸까..? 아마 내가 이전 강의 중에 빼먹고 따라가지 못한 부분이 있었나보다,,ㅎㅎ

 

 

오늘은 새로운 어노테이션들을 많이 배웠다.

기억하고 활용할 수 있도록 내용을 정리해본다!

 

@Embedded

- JPA에서 VO를 도메인 객체의 필드로 포함시키기 위해 사용하는 어노테이션.

- 주소의 경우 우편번호, 주소 등 여러 정보를 가지고 있는데, 이것을 도메인에 따로따로 필드를 선언하는 것 대신 주소에 대한 정보를 가진 VO를 하나 만든 후, 도메인에서 해당 VO 필드에 @Embedded 어노테이션을 적용시키면 DB에는 도메인 테이블의 컬럼들로 펼쳐져 저장이 된다.

- 엔티티의 가독성을 높일 수 있고, 여러 엔티티에 중복되는 값을 공통으로 사용할 수 있다는 장점이 있다.

 

@EntityListeners

- 이름에서 알 수 있듯이, 엔티티의 삽입, 삭제, 수정, 조회 이벤트 전 후에 대한 콜백 메소드를 제공하는 어노테이션.

- @EntityListeners(AuditingEntityListener.class): 해당 클래스에 Auditing(JPA에서 시간에 대해 자동으로 값을 넣어주는 기능)을 포함

   - @MappedSuperclass: 엔티티 클래스가 해당 클래스를 상속할 경우, 클래스의 필드를 컬럼으로 포함

 

@CreatedDate

- 엔티티가 생성되어 저장될 때 시간이 자동으로 저장됨.

 

@LastModifiedDate

- 엔티티의 값을 변경할 때 시간이 자동 저장됨.

 

나는 시간 정보가 필요한 테이블의 경우 직접 필드를 생성해서 사용했었는데... 어노테이션을 이용해 손쉽게 시간 데이터를 관리할 수 있다니 정말 놀랍다. 앞으로 요긴하게 써먹을 것 같다