Search

Spring Data JDBC

가. 설계

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