๐Ÿต java

JAVA | JPA ์•Œ์•„๋ณด๊ธฐ (JPA, JDBC, Hibernate & JPA)

c0zi 2023. 7. 10. 17:41

1. JPA


Java Persistence API์˜ ์•ฝ์ž๋กœ, ์ž๋ฐ” ์ง„์˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜ ๋ฐ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค

 

Persistence -> ์˜๊ตฌ์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐœ๋…๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ORM(Object-Relational Mapping) ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.

 

* ORM : ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹ ์— ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ํ•œ๊ตญ์ธ๊ณผ ํ”„๋ž‘์Šค์ธ, ์ผ๋ณธ์ธ ๋ฏธ๊ตญ์ธ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ

ํ•œ๊ตญ์ธ์ด "์•ˆ๋…•"์ด๋ผ๋Š” ์ธ์‚ฌ๋ฅผ ๊ฑด๋„ค๋ฉด, JPA๋Š” ์ด "์•ˆ๋…•"์„ ๊ฐ ๋‚˜๋ผ์˜ ์–ธ์–ด์— ๋งž๊ฒŒ ๋ฐ”๊พธ์–ด ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

์ด๋ฅผ JAVA๋กœ ์น˜ํ™˜ํ•ด๋ณด๋ฉด, JAVA Object๋ฅผ JPA์— ๋„˜๊ธฐ๋ฉด ์ด๋ฅผ DB๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด(์ฟผ๋ฆฌ)๋กœ ๋ฐ”๊พธ์–ด ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


JPA๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  : ๋ชจ๋“  ํ†ต์‹ ์€ ํŒŒ์‹ฑ์ด ํ•„์š”ํ•˜๋‹ค.

ํŒŒ์‹ฑํ•˜๋Š” ์ด์œ  : ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋Š” ์‹œ์Šคํ…œ ๊ฐ„ ํ˜ธํ™˜์„ฑ์„ ํ™•๋ณด, ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ

ํŒŒ์‹ฑ : ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๊ตฌ๋ฌธ์„ ํ•ด์„ํ•ด ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์‹œ์Šคํ…œ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •

 

ํ”„๋กœํ† ์ฝœ์˜ ์ •์˜

๋ฐ์ดํ„ฐ ํ˜•์‹ ๋ณ€ํ™˜

 


2. JDBC


JDBC(Java Database Connectivity)๋Š” ์ž๋ฐ”์˜ ํ‘œ์ค€ API๋กœ, ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

 

JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋กœ ์–ป์€ ResultSet์„ ์ง์ ‘ ๋งค ํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ResultSet์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋Š” ResultSet์—์„œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ์ฝ๊ณ  ํ•„์š”ํ•œ ๊ฐ์ฒด์— ์ˆ˜๋™์œผ๋กœ ๋งคํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

MyBatis๋Š” ๊ธฐ์กด JDBC ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต๊ณผ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์›€

 

  • Model -> DAO -> MyBatis -> DB

 

1. MyBatis ์‚ฌ์šฉ

public interface UserMapper {
	@Select("SELECT * FROM users WHERE id = #{id}")
	User getUserById(int id);
}

 

2. JDBC ์‚ฌ์šฉ

public class UserDAO {
	private final DataSource dataSource;
	public UserDAO(DataSource dataSource) {
		this.dataSource = dataSource;
	}
    public User getUserById(int id) {
        try (Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT *
        FROM users WHERE id = ?")) {
            statement.setInt(1, id);
            try (ResultSet resultSet = statement.executeQuery()) {
                if (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setEmail(resultSet.getString("email"));
                user.setPassword(resultSet.getString("password"));
                user.setUsername(resultSet.getString("username"));
                user.setRoles(resultSet.getString("roles"));
                return user;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3. Hibernate & JPA


Hibernate : ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ ์†Œ์Šค ORM(Object-Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ

 

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋ฉฐ, ๊ฐ์ฒด์™€ ๋ฐ ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘์„ ๊ด€๋ฆฌ
  • Model -> DAO -> Persistence Context -> DB ์กฐํšŒ์™€ ์“ฐ๊ธฐ (์—”ํ‹ฐํ‹ฐ ์ „๋‹ฌ ๋ฐ ์ฟผ๋ฆฌ DB ์ „๋‹ฌ, ์˜์†ํ™”, Flush, ๋”ํ‹ฐ์ฒดํ‚น, ์บ์‹ฑ)