JPA와 JDBC

1

자바

목록 보기
17/17

JDBC

테이블 생성

CREATE table jdbc(
	id int auto_increment primary key,
    name char(5) null,
    description char(20) null
)

connection 설정

   static final String DB_URL = "jdbc:mysql://localhost/jdbc";
   static final String USER = "??";
   static final String PASS = "??";
   static final String QUERY = "SELECT id, name, description FROM jdbc";
   
		try {
        
        // connection 객체 설정
        // connection 객체 수동으로 열고 닫고.....
        
            Connection connection = DriverManager.getConnection(DB_URL + DATABASE_NAME, USER, PASSWORD);
			System.out.println(connection);
		} catch (SQLException e) {
			e.printStackTrace();
		}

데이터 삽입

		final String DB_URL = "jdbc:mysql://localhost:3306/"; // DB 서버 접근용 URL
		final String DATABASE_NAME = "jdbc"; // 접속할 데이터베이스 이름
		
		// CREATE DTABASE testdb; 했을 때 DATABASE 이름
		
        final String USER = "????"; // 접속하는 사용자 계정
		final String PASSWORD = "????";
		
		final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
		
		try {
			
			Class.forName(DRIVER_NAME);
			
			Connection connection = DriverManager.getConnection(DB_URL+DATABASE_NAME,USER,PASSWORD);
			
			System.out.println(connection);
			
			Statement statement = connection.createStatement();
			// 쿼리를 하나씩 다 수작업으로 쳐가면서 작업
			final String dropTableQueryIfExists = "create table todo (val INT)";
            // Statement 객체를 통해서 쿼리를 주입시키고
            // 실행
			statement.execute(dropTableQueryIfExists);
			
		} catch (SQLException | ClassNotFoundException e) {
			e.printStackTrace();
		}

위 예시로 알아본 JDBC의 특징

  • sql문을 하나씩 다 작성해야한다는 점
  • Connection 객체 관리 (수동으로 열고 닫기)
  • statement나 preparedstatement, resultset를 통해 sql을 전달하고 결과를 받아야 했음

JPA

  • 그림 처럼 JPA는 Java Application과 jdbc api 사이에서 매개하는 역할
  • sql 구조를 생각하지 않고 Java Application을 설계하는 방식으로 데이터에 접근

장점

  • sql문을 적을 경우가 적어짐
  • sql 구조를 java application내에서 적용하지 않아도 됨
    • ex) 테이블 간의 참조를 해주려면 참조하려는 테이블의 pk가 fk로 필요하게 된다

단방향 매핑 A -> B

// Member와 Team의 관계가 N:1이므로

@Entity
public class Member{
	@Id @GeneratedValue
	private Long id;
    
// Number의 Team에 @ManyToOne 
	@ManyToOne
// Team 테이블의 TEAM_ID와 컬럼과 연결될 것이기에 @JoinColumn에 TEAM_ID작성
	@JoinColumn(name = "TEAM_ID")
	private Team team;
    
	@Column(name = "USERNAME")
	private String username;
}

@Entity
private class Team{
	@Id @GeneratedValue
	private Long id;
    
	@Column(name = "NAME")
	private String name;
}

// 실제로 멤버를 조회하면 JPA가 DB에 
// select ~ from member left outer join team ~ 쿼리를 날리게 된다

양방향 매핑 A <=> B


@Entity
public class Member{
	@Id @GeneratedValue
	private Long id;
    
	@ManyToOne
	@JoinColumn(name = "TEAM_ID")
	private Team team;
    
	@Column(name = "USERNAME")
	private String username;
}

@Entity
private class Team{
	@Id @GeneratedValue
	private Long id;
    
	@Column(name = "NAME")
	private String name;
    
	@OneToMany(mappedBy = "team")	//★★★★★
	private List<Member> members = new ArrayList<Member>();
}
// 양방향이 어떻게 되는거지?? 라는 의문... 단방향 두개가 연결되었다!!

// 객체는 방향성이 있지만
// 테이블은 연결관계에 방향성이 없기에,그 자체로 양방향 관계 성립
// Member -> Team , Team -> Member 단방향 2개가 연결된 것 => 양쪽으로 다 조인이 가능
// 하지만 Member의 team을 수정하고 Team의 members를 수정하면 둘 다 업데이트가 되어야하는데 신뢰성이 떨어지게 된다

// 어떻게 하지..?

// 멤버의 팀 값을 업데이트 할 때 FK를 업데이트 해야하나? 반대로 Team의 members를 업데이트 할 떄 업데이트??
// DB의 관점에서는 객체가 어떻게 뭘 참조하던 그냥 FK만 업데이트 해줘!! 인데...
// 단방향 매핑에서는 참조와 외래키만 업데이트 하면 되었는데.. 양방향은 안되는건가??
// 그래서 둘 중 하나로 외래키를 관리하자! 라는 양방향 매핑 규칙이 생성

// 양방향 매핑 규칙
// 객체의 두 관계 중 하나를 연관관계의 '주인'으로 지정
// 연관관계의 '주인'만 외래키의 등록, 수정 등의 작업 진행(DB에 접근 가능)
// 만약 두 객체 모두 데이터가 변해도 주인 것만 DB에 반영
// 주인이 아닌 쪽은 '읽기'만 가능하다
// 주인인 쪽은 @JoinColumn
// 주인이 아닌 쪽은 mappedBy 속성으로 주인을 지정
  • JPA(java persistence api)는 자바 진영의 ORM 기술 표준
    • JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하지 않아도 된다.
    • JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로 Mapping 해준다.
    • JPA는 내부적으로 JDBC API를 활용하는데, 개발자가 직접 JDBC API를 활용하면 패러다임 불일치, SQL 의존성 등으로 인해 효율성이 떨어진다.
    • 이 때, JPA를 활용한다면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 해결해 준다는 점에서 생산성을 크게 높인다.

ORM(객체 관계 매핑)

  • ORM(Object-Realational Mapping)은 객체와 관계형 DB를 매핑한다는 뜻
    • ORM 프레임워크를 사용하면 객체를 마치 자바 컬렉션에 저장하듯 저장할 수 있고, 이에 대해 ORM 프레임워크가 적절한 SQL을 생성해서 DB에 객체를 저장해준다
    • 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
    • ORM 프레임워크가 중간에서 매핑해준다

Hibernate

  • 자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크
    • 이러한 Hibernate 기반으로 만들어진 ORM 기술 표준이 바로 JPA다.
    • 즉 JPA라는 ORM 기술 표준을 구현한 것이 Hibernate이므로, JPA를 사용하려면 Hibernate를 사용하면 된다.
      이를 통해, 개발자는 관계형 DB를 사용해도 객체지향 어플리케이션 개발에 집중할 수 있게 된다.
profile
목적지가 있는 개발자 백재원입니다.

0개의 댓글