SQL ์์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌธ์ ์ ๊ณผ JPA
SQL ์์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌธ์ ์ ๊ณผ JPA
๊ฐ์
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด SQL์ ์ฌ์ฉํด์ผ ํ๋ฉฐ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ JDBC API๋ฅผ ์ฌ์ฉํด์ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ ์ ์๋ค.
JPA๋ฅผ ์ฌ์ฉํ์ ๋์ ์ด์ ์ด ๋ฌด์์ธ์ง, SQL์ ์ง์ ๋ค๋ฃฐ ๋์ ๋ฌธ์ ์ ์ ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ ์ํด ์๋ฐ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํด์ ํ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํด๋ณด์.
ํ์ ํ ์ด๋ธ์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ค๊ณ ๊ฐ์ ํ๊ณ CRUD(๋ฑ๋ก, ์กฐํ, ์์ , ์ญ์ ) ๊ธฐ๋ฅ์ ๊ฐ๋ฐํด๋ณด์.
JDBC ํ์ ๊ด๋ฆฌ ์ดํ๋ฆฌ์ผ์ด์
Member(ํ์) ๊ฐ์ฒด
์๋ฐ์์ ์ฌ์ฉํ Member(ํ์) ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
public class Member {
private int no;
private String email;
private String name;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
DAO(Data Access Object, ๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ์ฒด)
Member ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ฆฌํ ๋ชฉ์ ์ผ๋ก Member DAO๋ฅผ ๋ง๋ ๋ค.
public class MemberDao {
// ๋ฑ๋ก
public int save(Member member) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "INSERT INTO MEMBERS (EMAIL, MNAME) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, member.getEmail());
pstmt.setString(2, member.getName());
return pstmt.executeUpdate();
}
}
}
// ์กฐํ
public Member find(int no) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "SELECT MNO, EMAIL, MNAME FROM MEMBERS WHERE MNO = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, no);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
Member member = new Member();
member.setNo(no);
member.setEmail(rs.getString("EMAIL"));
member.setName(rs.getString("MNAME"));
return member;
} else {
throw new SQLException();
}
}
}
}
}
// ์์
public int update(Member member) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "UPDATE MEMBERS SET EMAIL = ?, MNAME = ? WHERE MNO = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, member.getEmail());
pstmt.setString(2, member.getName());
pstmt.setInt(3, member.getNo());
return pstmt.executeUpdate();
}
}
}
// ์ญ์
public int delete(int no) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "DELETE FROM MEMBERS WHERE MNO = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, no);
return pstmt.executeUpdate();
}
}
}
}
์๊ตฌ์ฌํญ์ ์ถ๊ฐ - ํ์ ์ฐ๋ฝ์ฒ
ํ์์ ์ฐ๋ฝ์ฒ๋ฅผ ํจ๊ป ์ ์ฅํด๋ฌ๋ผ๋ ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์คํค๋ง ๋ณ๊ฒฝ
ํ์ ํ ์ด๋ธ์ TEL ์ปฌ๋ผ์ ์ถ๊ฐํ๋ค.
ALTER TABLE `spms`.`members`
ADD COLUMN `TEL` VARCHAR(45) NULL AFTER `MNAME`;
Member ๊ฐ์ฒด ๋ณ๊ฒฝ
ํ์ ๊ฐ์ฒด์ tel ํ๋๋ฅผ ์ถ๊ฐํ๋ค.
public class Member {
private int no;
private String email;
private String name;
private String tel; // ์ถ๊ฐ
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
DAO ๋ณ๊ฒฝ
๋ฑ๋ก, ์กฐํ, ์์ SQL, JDBC API ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค.
public class MemberDao {
// ๋ฑ๋ก
public int save(Member member) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "INSERT INTO MEMBERS (EMAIL, MNAME, TEL) VALUES (?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, member.getEmail());
pstmt.setString(2, member.getName());
pstmt.setString(3, member.getTel());
return pstmt.executeUpdate();
}
}
}
// ์กฐํ
public Member find(int no) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "SELECT MNO, EMAIL, MNAME, TEL FROM MEMBERS WHERE MNO = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, no);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
Member member = new Member();
member.setNo(no);
member.setEmail(rs.getString("EMAIL"));
member.setName(rs.getString("MNAME"));
member.setName(rs.getString("TEL"));
return member;
} else {
throw new SQLException();
}
}
}
}
}
// ์์
public int update(Member member) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "UPDATE MEMBERS SET EMAIL = ?, MNAME = ?, TEL = ? WHERE MNO = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, member.getEmail());
pstmt.setString(2, member.getName());
pstmt.setString(3, member.getTel());
pstmt.setInt(4, member.getNo());
return pstmt.executeUpdate();
}
}
}
// ์ญ์
public int delete(int no) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/spms?user=leica&password=1234")) {
String sql = "DELETE FROM MEMBERS WHERE MNO = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, no);
return pstmt.executeUpdate();
}
}
}
}
์๊ตฌ์ฌํญ์ ์ถ๊ฐ - ์์ ํ
ํ์์ ์ด๋ค ํ ํ์ ํ์๋ก ์์๋์ด์ผ ํ๋ค๋ ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ค์ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ๊ณ , Member ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ณ , DAO๋ฅผ ๋ณ๊ฒฝํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํด์ผ ํ ๊ฒ์ด๋ค.
์๋์ ๊ฐ์ด Member ๊ฐ์ฒด์ Team ํ๋๋ฅผ ์ถ๊ฐํ๋ค.
public class Member {
private int no;
private String email;
private String name;
private String tel;
private Team team; // ์ถ๊ฐ
...
์ด ๋ Member ๊ฐ์ฒด๊ฐ Team ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ SQL์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
์ฆ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ์ฌ์ฉํด์ SQL์ ์จ๊ฒจ๋ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ด์ฉ ์ ์์ด DAO๋ฅผ ์ด์ด SQL์ ํ์ธํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ SQL์ ์ง์ ๋ค๋ฃฐ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์
- ์ง์ ํ ์๋ฏธ์ ๊ณ์ธต ๋ถํ ์ด ์ด๋ ต๋ค.
- ์ํฐํฐ๋ฅผ ์ ๋ขฐํ ์ ์๋ค.
- SQL์ ์์กด์ ์ธ ๊ฐ๋ฐ์ ํผํ๊ธฐ ์ด๋ ต๋ค.
Member๋ Team์ฒ๋ผ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๋ชจ๋ธ๋งํ ๊ฐ์ฒด๋ฅผ ์ํฐํฐ๋ผ ํ๋๋ฐ ์ง๊ธ์ฒ๋ผ SQL์ ๋ชจ๋ ๊ฒ์ ์์กดํ๋ ์ํฉ์์๋ ๊ฐ๋ฐ์๋ค์ด ์ํฐํฐ๋ฅผ ์ ๋ขฐํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
๋์ DAO๋ฅผ ์ด์ด ์ด๋ค SQL์ด ์คํ๋๊ณ ์ด๋ค ๊ฐ์ฒด๋ค์ด ํจ๊ป ์กฐํ๋๋์ง ์ผ์ผ์ด ํ์ธํด์ผ ํ๋ค.
๋ฌผ๋ฆฌ์ ์ผ๋ก SQL๊ณผ JDBC API๋ฅผ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ์จ๊ธธ์ ์์ด๋ ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ์ํฐํฐ์ ์์ฃผ ๊ฐํ ์์กด ๊ด๊ณ๋ฅผ ๊ฐ๊ฒ ๋๋ค.
์ด๋ฐ ๊ฐํ ์์กด ๊ด๊ณ ๋๋ฌธ์ ํ์ ๊ฐ์ฒด์ ํ๋๋ฅผ ํ๋ ์ถ๊ฐํ ๋๋ DAO์ CRUD ์ฝ๋์ SQL ๋๋ถ๋ถ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
JPA์ ๋ฌธ์ ํด๊ฒฐ
JPA๋ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค ์ ์๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ๋ ๊ฐ๋ฐ์๊ฐ ์ง์ SQL์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ JPA๊ฐ ์ ๊ณตํ๋ API๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋ฌ๋ฉด JPA๊ฐ ๊ฐ๋ฐ์ ๋์ ์ ์ ํ SQL์ ์์ฑํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค.
JPA๊ฐ ์ ๊ณตํ๋ CRUD API
์ ์ฅ ๊ธฐ๋ฅ
jpa.persist(member); // ์ ์ฅ
persist()๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค.
JPA๊ฐ ๊ฐ์ฒด์ ๋งคํ ์ ๋ณด๋ฅผ ๋ณด๊ณ INSERT SQL์ ์์ฑํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค.
์กฐํ ๊ธฐ๋ฅ
String memberId = "helloId";
Member member = jpa.find(Member.class, memberId); // ์กฐํ
find()๋ ๊ฐ์ฒด ํ๋๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋ค.
JPA๊ฐ ๊ฐ์ฒด์ ๋งคํ ์ ๋ณด๋ฅผ ๋ณด๊ณ SELECT SQL์ ์์ฑํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก Member ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
์์ ๊ธฐ๋ฅ
Member member = jpa.find(Member.class, memberId);
member.setName("์ด๋ฆ๋ณ๊ฒฝ"); // ์์
JPA๋ ๋ณ๋์ ์์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
๋์ ๊ฐ์ฒด๋ฅผ ์กฐํํด์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ๋ง ํ๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ UPDATE SQL์ด ์ ๋ฌ๋๋ค.
์ฐ๊ด๋ ๊ฐ์ฒด ์กฐํ
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam(); // ์ฐ๊ด๋ ๊ฐ์ฒด ์กฐํ
JPA๋ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์์ ์ SELECT SQL์ ์คํํ๋ค.
References
๐ ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ(์์ด์ฝ, 2015, ๊น์ํ)