개발일지(일간)
23년 01월 31일
move2
2023. 2. 1. 00:51
어제 고민했던 crudRepository에서 값을 찾아오지 못하던 문제를 해결했다.
@SuperBuilder와 TimeStamped의 문제였던것같은데, TimeStamped는 제대로 찍히지 않아 제거했고, SuperBuilder도 제거하고 일반 생성자를 써서 값을 저장해주었더니 findBy~로 탐색이 잘 되었다.
빌더타입 적용은 될 것 같은데 다음에 다시 시도해보아야 할 것 같다.
어제 공부했던 깃허브 액션도 간단하게 써 보았다.
일부러 실행이 되지 않는 코드를 써서 풀 리퀘스트를 날려 보았더니 체크에 실패했다고 알려주는 모습을 볼 수 있다.
스프링 부트 orm jpa 이전에 쓰던 jdbc와 mybatics에 대해서 배웠다.
jpa가 얼마나 개발을 할때 개발자를 편하게 해주는지 다시 다시 다시 알게 되었다.
다음은 jdbc로 데이터 저장을 할때 쓰이는 테스트 코드이다.
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import jdbc.dao.AccountDao;
import jdbc.vo.AccountVo;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class JDBCTest {
@Test
@DisplayName("JDBC DB 연결 실습")
void jdbcTest() throws SQLException {
// given
// docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=0empty -e POSTGRES_DB=messenger --name postgres_boot -d postgres
// docker exec -i -t postgres_boot bash
// su - postgres
// psql --username 0empty --dbname messenger
// \list (데이터 베이스 조회)
// \dt (테이블 조회)
// IntelliJ Database 에서도 조회
String url = "jdbc:postgresql://localhost:5432/messenger";
String username = "0empty";
String password = "pass";
// when
try (Connection connection = DriverManager.getConnection(url, username, password)) {
try {
String creatSql = "CREATE TABLE ACCOUNT (id SERIAL PRIMARY KEY, username varchar(255), password varchar(255))";
try (PreparedStatement statement = connection.prepareStatement(creatSql)) {
statement.execute();
}
} catch (SQLException e) {
if (e.getMessage().equals("ERROR: relation \"account\" already exists")) {
System.out.println("ACCOUNT 테이블이 이미 존재합니다.");
} else {
throw new RuntimeException();
}
}
}
// then
// DB 확인
}
@Test
@DisplayName("JDBC 삽입/조회 실습")
void jdbcInsertSelectTest() throws SQLException {
// given
String url = "jdbc:postgresql://localhost:5432/messenger";
String username = "0empty";
String password = "pass";
// when
try (Connection connection = DriverManager.getConnection(url, username, password)) {
System.out.println("Connection created: " + connection);
String insertSql = "INSERT INTO ACCOUNT (id, username, password) VALUES ((SELECT coalesce(MAX(ID), 0) + 1 FROM ACCOUNT A), 'user1', 'pass1')";
try (PreparedStatement statement = connection.prepareStatement(insertSql)) {
statement.execute();
}
// then
String selectSql = "SELECT * FROM ACCOUNT";
try (PreparedStatement statement = connection.prepareStatement(selectSql)) {
var rs = statement.executeQuery();
while (rs.next()) {
System.out.printf("%d, %s, %s", rs.getInt("id"), rs.getString("username"),
rs.getString("password"));
}
}
}
}
@Test
@DisplayName("JDBC DAO 삽입/조회 실습")
void jdbcDAOInsertSelectTest() throws SQLException {
// given
AccountDao accountDAO = new AccountDao();
// when
var id = accountDAO.insertAccount(new AccountVo("new user", "new password"));
// then
var account = accountDAO.selectAccount(id);
assert account.getUsername().equals("new user");
}
}
충분히 긴데, 이 코드만 있는 것이 아니라 dao클래스 파일과 vo클래스 파일도 있다.
이 다음에 나타난게 ORM인데, ORM 은 DAO 또는 Mapper 를 통해서 조작하는것이 아니라 테이블을 아예 하나의 객체(Object)와 대응시켜 버린다.
orm은 위와 같은 과정을 거쳐 object와 테이블을 일치시킨다.
이 정도면 지금까지 프로젝트를 하면서 jpa를 사용할때 적었던 코드는 실제로 jpa가 대신 해주는 일의 1/10도 안될것같다.
jpa가 나 대신 많은 일을 해주고 있는 것을 다시 다시 다시 다시 배우게 되었다.