728x90
반응형




spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpadb?useUnicode=yes&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=1234
#ddl : Data Definition Language : 데이터 정의 -> create
#아래 코드는 JPA 코드 자동생성이라서 한번 생성시키고 주석처리
#spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.ddl-auto=update
#DDL 생성시 DB 고유의 기능을 사용
spring.jpa.generate-ddl=false
#실행시 Console에 SQL문 출력
spring.jpa.show-sql=true
spring.jpa.database=mysql
#mysql 상세지정
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#로그레벨 :info, debug
logging.level.org.hibernate=info
jpadb? == 자신의 스키마이름


com.bit.domain
이런식으로 도메인에 만들어두면 설정해둔 DB에 테이블과 시퀀스, PK가 생성된다.


package com.bit.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Entity
@Table(name = "tbl_members")
@EqualsAndHashCode(of = "uid") // 동일한 내용인지 같은 객체인지 비교 메소드 자동 생성
public class Member {
// @id는 값을 PK로 설정
@Id
private String uid;
private String upw;
private String uname;
}

@ToString(exclude = "files") 는 참조형으로 Tostring에서 제외

package com.bit.domain;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString(exclude = "files")
@Entity
@Table(name = "tbl_pds")
public class PDSBoard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long pid;
private String pname;
private String pwriter;
@OneToMany
@JoinColumn(name = "pdsno")
private List<PDSFile> files;
}

package com.bit.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Entity
@Table(name = "tbl_pdsfiles")
public class PDSFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long fno;
private String pdsfile;
}

package com.bit.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString(exclude = "member") //member는 참조만하고 GG
@Entity
@Table(name = "tbl_profile")
@EqualsAndHashCode(of = "fname") // 동일한 내용인지 같은 객체인지 비교 메소드 자동 생성
public class Profile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long fno;
private String fname;
private boolean current;
// 연관관계
@ManyToOne
private Member member;
}

package com.bit.persistence;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import com.bit.domain.Member;
public interface MemberRepository extends CrudRepository<Member, String> {
@Query("SELECT m.uid, count(p) FROM Member m LEFT OUTER JOIN Profile p ON m.uid = p.member WHERE m.uid = ?1 GROUP BY m")
public List<Object[]> getMemberWithProfileCount(String uid);
@Query("SELECT m, p FROM Member m LEFT OUTER JOIN Profile p ON m.uid = p.member WHERE m.uid = ?1 AND p.current = true")
public List<Object[]> getMemberWithProfile(String uid);
}

package com.bit.persistence;
import org.springframework.data.repository.CrudRepository;
import com.bit.domain.PDSBoard;
public interface PDSBoardRepositoy extends CrudRepository<PDSBoard, Long> {
}

package com.bit.persistence;
import org.springframework.data.repository.CrudRepository;
import com.bit.domain.PDSFile;
public interface PDSFileRepositoy extends CrudRepository<PDSFile, Long> {
}

package com.bit.persistence;
import org.springframework.data.repository.CrudRepository;
import com.bit.domain.Profile;
public interface ProfileRepository extends CrudRepository<Profile, Long> {
}

- 메서드 순서대로
- 1)테이블생성
- 2)테이블에 데이터 넣기
- 3)번째 메소드는 같은 객체넣는거지만 카카오톡의 멀티프로필 느낌으로 user1에 최대 4개의 새 프로필(이름)을 생성한 것
- 4)user1의 프로필이 몇개인지
- 5)user1의 프로필(정보) 가져오기
값은 콘솔창에 뜬다.
package com.bit;
import java.util.Arrays;
import java.util.stream.IntStream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import com.bit.domain.Member;
import com.bit.domain.Profile;
import com.bit.persistence.MemberRepository;
import com.bit.persistence.ProfileRepository;
import lombok.extern.java.Log;
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Log
@Commit // 테스트 결과를 commit
public class ProfileTests {
// 주입
@Autowired
MemberRepository mRepo;
@Autowired
ProfileRepository pRepo;
@Test
public void createTbl() {
System.out.println("테이블 생성");
}
@Test
public void testInsertMember() {
IntStream.range(1, 101).forEach(i->{
Member member = new Member();
member.setUid("user"+i);
member.setUpw("pw"+i);
member.setUname("사용자"+i);
mRepo.save(member);
});
}
@Test
public void testInsertProfile() {
Member member = new Member();
member.setUid("user1");
for (int i = 1; i < 5; i++) {
Profile profile = new Profile();
profile.setFname("face" + i + ".jpg");
if (i == 1)
profile.setCurrent(true);
profile.setMember(member);
pRepo.save(profile);
}
}
@Test
public void testFetchJoin1() {
mRepo.getMemberWithProfileCount("user1").forEach(arr->System.out.println(Arrays.toString(arr)));
}
@Test
public void testFetchJoin2() {
mRepo.getMemberWithProfile("user1").forEach(arr->System.out.println(Arrays.toString(arr)));
}
}

package com.bit;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import com.bit.persistence.PDSBoardRepositoy;
import lombok.extern.java.Log;
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Log
@Commit
public class PDSBoardTests {
@Autowired
private PDSBoardRepositoy pRepo;
@Test
public void testCreate() {
System.out.println("테이블 생성");
}
}
Boot04 메모장
1.Project->Spring Starter Project => boot04
- lombok
- Spring Boot DevTools
- Spring Data JPA
- MySQL Driver
- Spring Web Service
2.application.properties (boot03 복사)
#로그레벨 : infon, debug
logging.level.org.hibernate=info
3.domain, persistence 패키지 생성
4.domain
-Member.java
- PDSBoard.java
- PDSFile.java
- Profile.java
5.persistence
- MemberRepository.java
- PDBFileRepository.java
- PDSBoardRepository.java
- ProfileRepository.java
6.Junit/test
- ProfileTests.java
- PDSBoardTests.java728x90
반응형
'Spring > Spring framework' 카테고리의 다른 글
| boot05 (0) | 2021.08.11 |
|---|---|
| thymeleaf (0) | 2021.08.10 |
| JPA (0) | 2021.08.09 |
| [JPA] boot3 데이터 DB 입출력 (0) | 2021.08.09 |
| [JPA] boot3 데이터 DB 입출력 (0) | 2021.08.06 |
| 환경오류 (0) | 2021.08.06 |