ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [spring] spring과 mysql 연결
    spring 2023. 5. 8. 23:24

     

    1.파일명: /sbb/build.gradle

    [기존 예시]

    (... 생략 ...)
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        developmentOnly 'org.springframework.boot:spring-boot-devtools'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
        
        # H2 연결
        runtimeOnly 'com.h2database:h2'
    }
    
    (... 생략 ...)

     

    [mysql]

    dependencies {
       implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
       implementation 'org.springframework.boot:spring-boot-starter-web'
       
       # mysql 연결
       runtimeOnly 'com.mysql:mysql-connector-j'
       
       implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
       annotationProcessor 'org.projectlombok:lombok'
       testImplementation 'org.springframework.boot:spring-boot-starter-test'
       developmentOnly 'org.springframework.boot:spring-boot-devtools'
    }

     

    - 자료 검색시 implementation 'mysql:mysql-connector-java' 가 주로 나오지만 현재 코드에서는 오류 발생

      버젼업으로 인해 수정된 것으로 추정

      (수정전) mysql:mysql-connector-java -> (수정후) com.mysql:mysql-connector-j

     

    ※ 참고

     

     

    • implementation: 의존 라이브러리 수정시 본 모듈까지만 재빌드
    • api: 의존 라이브러리 수정시 본 모듈을 의존하는 모듈들도 재빌드
    • compileOnly: compile 시에만 빌드하고 빌드 결과물에는 포함하지 않음
    • runtimeOnly: runtime 시에만 필요한 라이브러리인 경우
    • testImplementation: 테스트하는 경우에만 사용
    • developmentOnly: 개발환경에만 적용되는 설정

     

     

    2. 파일명: /sbb/src/main/resources/application.properties

    [기존 예시]

    # DATABASE
    spring.h2.console.enabled=true
    spring.h2.console.path=/h2-console
    spring.datasource.url=jdbc:h2:~/local
    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.username=sa
    spring.datasource.password=

     

    [mysql]

    #MYSQL
    spring.datasource.url=jdbc:mysql://localhost:3306/spring(테이블명)?serverTimezone=UTC&characterEncoding=UTF-8
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.username=root
    spring.datasource.password=
    
    # JPA
    spring.jpa.properties.hibernate.format_sql=true
    spring.jpa.properties.hibernate.show_sql=true
    spring.jpa.hibernate.ddl-auto=create
    • none - 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다.
    • update - 엔티티의 변경된 부분만 적용한다.
    • validate - 변경사항이 있는지 검사만 한다.
    • create - 스프링부트 서버가 시작될때 모두 drop하고 다시 생성한다.
    • create-drop - create와 동일하다. 하지만 종료시에도 모두 drop 한다.

     

     

    3. 파일명:/sbb/src/main/java/com/mysite/sbb/Question.java

    [기존 예시]

    package com.mysite.sbb;
    
    import java.time.LocalDateTime;
    import java.util.List;
    
    import jakarta.persistence.CascadeType;
    import jakarta.persistence.Column;
    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.OneToMany;
    
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    @Entity
    public class Question {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
    
        @Column(length = 200)
        private String subject;
    
        @Column(columnDefinition = "TEXT")
        private String content;
    
        private LocalDateTime createDate;
    
        @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
        private List<Answer> answerList;
    }

     

    [mysql]

    package com.mysite.sbb;
    
    import com.fasterxml.jackson.annotation.JsonManagedReference;
    import jakarta.persistence.*;
    import lombok.*;
    
    import java.time.LocalDateTime;
    import java.util.List;
    
    @Data
    @Entity
    public class question {
        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        private Integer id;
    
        @Column(length = 200)
        private String title;
    
        @Column(columnDefinition = "TEXT")
        private String contents;
    
        private LocalDateTime createDate;
    
        // CascadeType.REMOVE : 질문을 삭제하면 그에 달린 답변들도 모두 함께 삭제하기 위해
        @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
        @JsonManagedReference
        private List<answer> answerList;
    
    }
    • @Data - lombok의 기능으로 Setter, Getter, ToString, Constructor에 대한 정보를 자동적으로 생성
    • @JsonManagedReference - 순환 참조를 방어하기 위해 부모 클래스에 작성

     

     

    4. 파일명:/sbb/src/main/java/com/mysite/sbb/Answer.java

    [기존 예시]

    (... 생략 ...)
    import jakarta.persistence.ManyToOne;
    (... 생략 ...)
    
    @Getter
    @Setter
    @Entity
    public class Answer {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
    
        @Column(columnDefinition = "TEXT")
        private String content;
    
        @CreatedDate
        private LocalDateTime createDate;
    
        @ManyToOne
        private Question question;
    }

     

    [mysql]

    package com.mysite.sbb;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    import jakarta.persistence.*;
    import lombok.*;
    
    import java.time.LocalDateTime;
    
    @Data
    @Entity
    public class answer {
        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        private Integer id;
    
        @Column(columnDefinition = "TEXT")
        private String contents;
    
        private LocalDateTime createDate;
    
        @ManyToOne// 부모 자식 관계 구조
        @JoinColumn(name="questionId")
        @JsonBackReference
        private question question;
    }
    • @JoinColumn - 외래 키를 매핑할 때 사용, 생략 가능
    • @JoinColumn(name="?") - 단순하게 외래키의 이름만 지정
    • @JoinColumn(referencedColumnName="?") - 어떤 컬럼을 참조하는지를 지정
    • @JsonBackReference - 순환 참조를 방어하기 위해 자식 클래스에 작성

     

     

    5. 테스트 코드 실행 후 결과

     

     

    [참고 자료]

    https://wikidocs.net/book/7601

     

    점프 투 스프링부트

    점프 투 스프링부트는 Spring Boot Board(SBB)라는 이름의 게시판 서비스를 만들어가는 과정을 설명한 스프링부트 입문서이다. 자바 설치부터 시작하여 서비스 운…

    wikidocs.net

    https://writemylife.tistory.com/57

     

    gradle 의존성 옵션들

    의존성 옵션들 implementation: 의존 라이브러리 수정시 본 모듈까지만 재빌드 본 모듈을 의존하는 모듈은 해당 라이브러리의 api 를 사용할 수 없음 api: 의존 라이브러리 수정시 본 모듈을 의존하는

    writemylife.tistory.com

     

    댓글

Designed by Tistory.