
๊ต๋ด ํ์๋ค์ด ํผ ๋ฐฑ์ค ๋ฌธ์ ๋ฅผ ๋ชจ๋ DB์ ๋ฃ๋ ๋ฐฐ์น ํ๋ก๊ทธ๋จ์ ์์ฑํ๋๋ฐ ์๋๊ฐ ๋๋ฌด ๋๋ฆฌ๋ค. ์ด๋ฅผ ๊ฐ์ ํด๋ณด์.
์ฐ์ PK ์์ฑ ์ ๋ต์ด TABLE์ผ๋ก ๋์ด ์์ด์, IDENTITY๋ก ๋ณ๊ฒฝํ๋ค. ํค ์์ฑ ์ ์ฉ ํ ์ด๋ธ์ ํ๋ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ์ค๋ฅผ ํ๋ด๋ด๋ ์ ๋ต์ธ๋ฐ, ์ต์ ํ ๋์ด์์ง ์์ ํ ์ด๋ธ์ ์ง์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋์ค์ง ์๋๋ค. IDENTITY ์ ๋ต์ ๊ธฐ๋ณธ ํค ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ๋ ์ ๋ต์ด๋ค. (DDL๋ก ๊ธฐ๋ณธํค์ AUTO_INCREMENT ๊ฑธ๊ธฐ)
์ด๋ ๊ฒ ํ๋ฉด JPA๋ก BATCH INSERT๋ฅผ ํ ์์๋ค. ์ ์ JPA๋ฅผ ๋์์ฃผ๊ณ JDBC๋ฅผ ์ฌ์ฉํด๋ณด์.
package skku.skkujoon.repository;
import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import skku.skkujoon.domain.Problem;
import skku.skkujoon.domain.User;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
/**
* Only for batch insert
* @author ks1ksi
*/
@Repository
@RequiredArgsConstructor
public class JdbcRepository {
private final JdbcTemplate jdbcTemplate;
public void insertUsers(List<User> users) {
String sql = "insert into user (handle, bio, solved_count, tier, rating, ranking, global_rank) values (?, ?, ?, ?, ?, ?, ?)";
jdbcTemplate.batchUpdate(sql,
users,
users.size(),
(ps, u) -> {
ps.setString(1, u.getHandle());
ps.setString(2, u.getBio());
ps.setInt(3, u.getSolvedCount());
ps.setInt(4, u.getTier());
ps.setInt(5, u.getRating());
ps.setInt(6, u.getRanking());
ps.setInt(7, u.getGlobalRank());
});
}
public void insertProblems(List<Problem> problems) {
String sql = "insert into problem (problem_number, title_ko, level, solved_by_skku, solvable, partial) values (?, ?, ?, ?, ?, ?)";
jdbcTemplate.batchUpdate(sql,
problems,
problems.size(),
(ps, p) -> {
ps.setLong(1, p.getProblemNumber());
ps.setString(2, p.getTitleKo());
ps.setInt(3, p.getLevel());
ps.setInt(4, p.getSolvedBySkku());
ps.setBoolean(5, p.isSolvable());
ps.setBoolean(6, p.isPartial());
});
}
public void insertUserProblems(User user, List<Problem> problems) {
String sql = "insert into user_problem (user_id, problem_id) values (?, ?)";
jdbcTemplate.batchUpdate(sql,
problems,
problems.size(),
(ps, p) -> {
ps.setLong(1, user.getId());
ps.setLong(2, p.getId());
});
}
public void updateProblems(List<Problem> problems) {
String sql = "update problem set solved_by_skku = solved_by_skku + 1 where problem_id = ?";
jdbcTemplate.batchUpdate(sql,
problems,
problems.size(),
(ps, p) -> {
ps.setLong(1, p.getId());
});
}
}

7์๊ฐ ๋๊ฒ ๊ฑธ๋ฆฌ๋๊ฑธ 1์๊ฐ์ผ๋ก ์ค์๋ค. solved.ac api ํธ์ถ ์ ํ์ด ์์ด์ ์๊ฐ์ ๋ ์ค์ด๊ธฐ๋ ํ๋ค ๊ฒ ๊ฐ๋ค.