-
[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
'spring' 카테고리의 다른 글
[spring] tdd와 단위 테스트 (0) 2023.05.22 [spring] 프록시 (Proxy) 패턴 (0) 2023.05.02 [spring] MyBatis와 Hibernate의 차이 (0) 2023.03.28 [spring] IntelliJ Cannot resolve symbol 'persistence' (1) 2023.03.27 [spring] GDSC spring study 2주차 오답노트 (0) 2023.03.21