가. 설계
1) RDBMS 테이블 설계
2) Schema.sql
DROP TABLE IF EXISTS github;
DROP TABLE IF EXISTS game;
DROP TABLE IF EXISTS user;
CREATE TABLE IF NOT EXISTS user (id int auto_increment primary key, email varchar(64) unique, created_date datetime);
CREATE TABLE IF NOT EXISTS github (
user int primary key references user(id),
email varchar(64),
github_id varchar(64)
);
CREATE TABLE IF NOT EXISTS game(
id int auto_increment primary key,
user int references user(id),
user_key int,
game_name varchar(64)
)
Java
복사
나. One to One
1) 부모 객체
•
Aggregate Root 객체에 자식 객체를 맵핑함
public class User {
private Github github;
public Github getGithub(){return github;}
public void setGithub(Github github){this.github = github}
}
Java
복사
2) 자식 객체
•
primary key는 부모 객체가 됨
public class Github {
@Id
private Long user;
private String email;
private String githubId;
// 생략
}
Java
복사
다. One to Many
1) 부모 객체
•
부모 객체에서 자식 객체의 삽입 및 삭제 관리
public class User {
@Id
private Long id;
private List<Game> games = new ArrayList<>()
public void addGame(Game game) {
this.games.add(game);
}
public void removeAllGame() {
this.games.clear();
}
public List<Game> getGames() {
return this.games;
}
}
Java
복사
2) 자식 객체
•
부모 객체에 대해 int 타입으로 외래키를 받는 부분이 존재함
→ 이게 외래키가 아닌데? Test Code 돌려보면 무조건 0으로만 찍히는데 무슨 역할을 하는거지?
public class Game {
@Id
private Long id;
private int user;
private String gameName;
public Game(String gameName) {
this.gameName = gameName;
}
public void setId(Long id) {
this.id = id;
}
public void setUser(int user) {
this.user = user;
}
public void setGameName(String gameName) {
this.gameName = gameName;
}
public Long getId() {
return id;
}
public int getUser() {
return user;
}
public String getGameName() {
return gameName;
}
}
Java
복사
3) 기타
•
user:game(1:N 관계)를 맵핑하기 위해 schema.sql의 game table 부분에 user_key 삽입함
라. Many to Many
@Autowired
private ApplicationContext ctx;
Plain Text
복사
@SpringBootTest
class SpringBootDemoApplicationTests {
@Autowired
private ApplicationContext ctx;
@Autowired
private UserRepository userRepo;
private Logger logger = LoggerFactory.getLogger(SpringBootDemoApplicationTests.class);
@Test
void contextLoads() {
assertThat(ctx).isNotNull();
logger.debug("ApplicationContext is not null");
}
@Test
void LoggerNotNull() {
assertThat(logger).isNotNull();
logger.debug("Logger OK");
}
}
Plain Text
복사
마. Spring에 MySQL 연동
1) mysql-connector 추가
// build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Java
복사
2) mysql connection 설정
// application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3309/test_table?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=dev
spring.datasource.password=pass
Java
복사
3) data.sql, schema.sql 적용
// application.properties
spring.datasource.initialization-mode=always
Java
복사
Reference
•
Spring에 MySQL 연동하기, https://velog.io/@ddusi/Spring-1