Spring/Spring framework

boot04 회원게시판

원2 2021. 8. 9. 16:26
728x90
반응형


InnoDB로 설정을 해줘야한다


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가 생성된다.

Member.java
PK, InnBD, TableName, columns 설정이 됨

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;
}

PDSBoard.java

@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;
}

PDSFile.java

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;
}

MemberRepository.java interface

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);
}

PDSBoardRepository.java interface

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> {

	
}

ProfileTests ++ 람다식

  • 메서드 순서대로
  • 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)));
	}
}

PDSBoardTests

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.java
728x90
반응형

'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