ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • IntelliJ IDEA & JPA 초보자 가이드: API 명세서 확인 후 데이터베이스 컬럼 생성부터 데이터 입력까지!
    🌱 Spring 프레임워크 2025. 1. 4. 20:23
    728x90

    1. 프로젝트 설정

    1.1 Spring Initializr를 이용한 프로젝트 생성

    start.spring.io 접속

    Project: Maven, Language: Java, Spring Boot: (최신 stable 버전) 선택

     

    Dependencies 추가:

       Validation - 사용자 입력 데이터의 유효성을 검증합니다.

    • 설명: @NotNull, @NotBlank, @Size, @Email 등의 어노테이션을 사용하여 필드의 유효성 검증 규칙을 정의할 수 있습니다. 컨트롤러에서 @Valid 어노테이션을 사용하면 자동으로 유효성 검증을 수행하고, 유효하지 않은 데이터일 경우 예외를 발생시킵니다. 이를 통해 잘못된 데이터가 데이터베이스에 저장되는 것을 방지하고, 애플리케이션의 안정성을 높일 수 있습니다.

       Spring Web  - 웹 애플리케이션 개발을 위한 기능을 제공합니다.

    • 설명: Spring MVC 프레임워크를 기반으로 RESTful 웹 서비스를 구축하는 데 필요한 컴포넌트들을 제공합니다. @Controller, @RestController, @RequestMapping 등의 어노테이션을 사용하여 웹 요청을 처리하고, JSON 또는 XML 형식의 데이터를 응답으로 반환할 수 있습니다.

       Lombok  - 자바 코드 작성을 간편하게 해주는 라이브러리입니다.

    • 설명: @Getter, @Setter, @ToString, @Builder 등의 어노테이션을 사용하여 getter/setter, toString, 생성자 등의 코드를 자동으로 생성해줍니다. 이를 통해 코드량을 줄이고 가독성을 높일 수 있습니다.

       Spring Data JPA  - JPA를 더욱 편리하게 사용할 수 있도록 도와주는 라이브러리입니다.

    • 설명: JpaRepository 인터페이스를 제공하여 기본적인 CRUD 작업을 쉽게 구현할 수 있도록 지원합니다. 또한, JPQL 쿼리 메서드 기능을 통해 메서드 이름으로 쿼리를 생성할 수 있도록 지원하여 개발 생산성을 높여줍니다.
    //    기본 제공되는 메서드들
    //
    //    저장 & 수정
    //    User save(User user);                        // 엔티티 저장 또는 수정
    //    List<User> saveAll(List<User> users);        // 여러 엔티티 저장
    //
    //    조회
    //    Optional<User> findById(Long id);            // ID로 조회
    //    List<User> findAll();                        // 전체 조회
    //    List<User> findAllById(List<Long> ids);      // 여러 ID로 조회
    //
    //    삭제
    //    void delete(User user);                      // 엔티티 삭제
    //    void deleteById(Long id);                    // ID로 삭제
    //    void deleteAll();                            // 전체 삭제
    //
    //    기타
    //    long count();                                // 전체 개수 조회
    //    boolean existsById(Long id);                 // ID 존재 여부 확인

     MySQL Driver  - Java 애플리케이션과 MySQL 데이터베이스를 연결하는 데 필요한 JDBC 드라이버입니다.

    • 설명: MySQL 데이터베이스에 접속하고 쿼리를 실행하기 위해서는 JDBC 드라이버가 필요합니다. Spring Boot 프로젝트에서는 pom.xml 또는 build.gradle 파일에 MySQL Driver 의존성을 추가하여 JDBC 드라이버를 사용할 수 있습니다.

    "GENERATE" 버튼 클릭하여 프로젝트 다운로드

     

    2. GitHub Repositories 생성 및 연동

      2.1 GitHub Repositories 생성

    • GitHub 웹사이트 접속 후 새로운 Repositories 생성
    • Repositories 이름, 설명 등 입력 후 생성

      2.2 GitHub Desktop을 이용한 프로젝트 연동

    • GitHub Desktop 실행
    • "File" -> "Add local repository" 선택하여 IntelliJ IDEA 프로젝트 폴더 선택
    • "Publish repository" 버튼 클릭하여 GitHub 레포지토리에 push

     

    2.3 IntelliJ IDEA에서 Git 연동

    • IntelliJ IDEA에서 "VCS" -> "Enable Version Control Integration" 선택
    • Git 선택 후 확인

    2.4 IntelliJ IDEA에서 프로젝트 열기

    • IntelliJ IDEA 실행 후 "Open" 또는 "Import Project" 선택
    • 다운로드한 프로젝트 폴더 선택
    • 프로젝트 import 완료 후 Maven dependencies 자동으로 로드

    3. 포스트맨 실행 후 API 명세서 기반으로 테스트 항목 생성

    API 명세서
    1. 데이터 생성 API
    • Method: POST
    • URL: /memo
    • Request Body:
        JSON
          {
            "content" : "안녕하세요"
          }
    • Response:
      • 200 OK
      • Location header: 생성된 데이터 리소스 URI (예: /data/1)

     

    4. IntelliJ IDEA에서 코드 작성

    패키지 및 클래스 생성

    API 명세서를 기준으로 봤을때 들어가야 하는 컬럼은 

    - Id ( auto ,pk)

    - content

    - created_at ( auto, 현재시간)

     

    코드 설명

    @Entity // << 이건 JPA가 관리하는 엔티티 클래스(테이블)라는 것을 알려주는 어노테이션
    @Table(name = "memo") // << 이건 데이터베이스의 memo 테이블과 매핑되는 클래스라는 것을 알려주는 어노테이션
    public class Memo {
        @Id // << 이건 데이터베이스의 PK(Primary Key)라는 것을 알려주는 어노테이션
        @GeneratedValue(generator = "increment")  // << 이건 데이터베이스의 자동 증가하는 값을 의미
        public Long id;
    
        // << length는 데이터베이스의 길이를 의미, nullable은 데이터베이스의 null을 허용하는지에 대한 여부를 의미
        @Column(length = 200, nullable = false) // << 이건 데이터베이스의 컬럼을 의미
        public String content;
    
        // << nullable은 데이터베이스의 null을 허용하는지에 대한 여부를 의미
        @Column(nullable = false) // << 이건 데이터베이스의 컬럼을 의미
        public Instant created_at;  // << 이건 자바 8부터 추가된 날짜와 시간을 다루는 클래스
    
        @PrePersist // << 이건 JPA의 이벤트 리스너를 의미
        public void prePersist() {
            created_at = Instant.now(); //now()와 같이 현재 시간을 의미
        }
    // DB 기준으로 아래 항목을 만들것이다.
    //  id (PK) << 이건 데이터베이스의 PK(Primary Key)라는 것을 알려주는 어노테이션
    //     -  auto_increment << 이건 데이터베이스의 자동 증가하는 값을 의미
    //  content
    //  created_at (now) << 이건 데이터베이스의 기본값을 의미

     

    코드 작성 (코드 작성은 필요에 의해 클래스를 생성하기에 화면이동이 많습니다.

     

    컨트롤러 클래스

     

    메모리퀘스트 클래스 이동하여 변수생성

     

    컨트롤러로 이동 하여 나머지 코드 작성

     

     

    작성하다보니 서비스에서 로직 생성해야 하는데 서비스 클래스가 없어서 생성하고 서비스 클래스에서 로직 작성

     

    작성하다보니 데이터 베이스에 저장하기 위한 메소드가 들어있는 Reposieory 클래스가 없어서 이동하여 작성

     

    //    ------------------------------------------------------------
    //    기본 제공되는 메서드들
    //
    //    저장 & 수정
    //    User save(User user);                        // 엔티티 저장 또는 수정
    //    List<User> saveAll(List<User> users);        // 여러 엔티티 저장
    //
    //    조회
    //    Optional<User> findById(Long id);            // ID로 조회
    //    List<User> findAll();                        // 전체 조회
    //    List<User> findAllById(List<Long> ids);      // 여러 ID로 조회
    //
    //    삭제
    //    void delete(User user);                      // 엔티티 삭제
    //    void deleteById(Long id);                    // ID로 삭제
    //    void deleteAll();                            // 전체 삭제
    //
    //    기타
    //    long count();                                // 전체 개수 조회
    //    boolean existsById(Long id);                 // ID 존재 여부 확인
    //    ------------------------------------------------------------

     

     

    이제 컨트롤러 가서 마무리 하자

    코드 작성이 끝났으니 서버 실행 후 포스트 맨에서 테스트 로 마무리 

     

    데이터는 정상적으로 잘 들어왔다. 

     


    데이터 조회 API

    • Method: GET
    • URL: /data/{id}
    • Path Variable:
      • id: 데이터 ID (Long)
    • Response:
      JSON
       
      JSON
      	{
       	 "name": "이름",
       	 "content": "내용",
      	}
    • Response Status Code:
      • 200 OK - 데이터 조회 성공
      • 404 Not Found - 해당 ID의 데이터가 존재하지 않음

    순서는 입력하는 것처럼 필요한것 위주로 진행 해보자 

     

    포스트맨에 가서 코드작성 전 테스트 준비 먼저 진행

     

     

     

    Data 클래스 생성 후 제이슨에 들어갈 객체 생성

    ( 객체 생성 및 데이터 등록은 메모 등록과 동일하게 사전에 진행)

    @lombok.Data // << lombok 라이브러리를 사용하여 
    				getter, setter, toString, equals, hashCode 를 자동으로 생성해준다.
    @Entity 
    @Table(name = "data")
    public class Data {
    
        @Id
        @GeneratedValue(generator = "increment")
        Long id;
    
        @Column(length = 30)// length는 데이터베이스의 길이를 의미
        String name;
    
        @Column(length = 200, nullable = false)
        String content;
    
        @Column(nullable = false) // nullable은 데이터베이스의 null을 허용하는지에 대한 여부를 의미
        Instant createdAt;
        @PrePersist
        public void prePersist() {
            createdAt = Instant.now();
        }

    DateController 클래스 생성 및 코드 작성

     

    서비스클래스에 일시키려는데 클래스가 없으니 생성하고 코드 작성

    서비스 클래스에서는 JPA 에서 제공하는 메소드를 사용 할 예정이다.

    //    조회
    //    Optional<User> findById(Long id);            // ID로 조회
    //    List<User> findAll();                        // 전체 조회
    //    List<User> findAllById(List<Long> ids);      // 여러 ID로 조회

     

     

    서비스 클래스 작성을 완료 했으니 컨트롤러 클래스 가서 마무리 하기

     

    728x90
Designed by Tistory.