Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejava
themeEmacs
collapsetrue
package com.psmon.springdb;

import org.springframework.data.repository.CrudRepository;

//This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
//CRUD refers Create, Read, Update, Delete

public interface UserRepository extends CrudRepository<User, Long> {

}


CRUD를 이용하여 데이터 제어하기

CURD를 이용한 데이터제어를 유닛테스트기를 이용하여 테스트해보겠습니다.

간단하게 사용자를 추가하고, 조회를 하는 코드입니다.

Code Block
languagejava
themeEmacs
collapsetrue
package com.psmon.springdb;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JparestdemoApplicationTests {
	
	@Autowired
	private UserRepository userRepository;

	@Test
	public void contextLoads() {		
		jpaTest1();		
	}
	
	public void jpaTest1() {
		// 사용자 생성
		User addUser = new User();
		addUser.setName("minsu");
		addUser.setEmail("test@x.com");
		userRepository.save(addUser);
		
		// 사용자 조회
		Iterable<User> userList = userRepository.findAll();		
		userList.forEach(item->System.out.println(item.getName() ));		
	}
}

...

Code Block
languagesql
themeEmacs
collapsetrue
-- 사용자생성
INSERT INTO `spring`.`user`
(`id`,
`email`,
`name`)
VALUES
(<{id:}>,
<{email: >,
<{name:}>);

-- 사용자 조회
SELECT * FROM user


JPA를 활용했을때 장점은, 일괄적인 객체접근을 통해 데이터모델을 핸들링 할수가 있다란 것이며

일반적으로 소스와 통합이 되기때문에  SP이 필요없이 형상관리가 될수 있다란것이며  

데이터 모델이 고정적이지 않고 복잡한 SQL문 혹은 조인이 사용이 되는 데이터 추출에서는 권장되지 않습니다.

JPA Relation

일반적으로 DB의 테이블은 하나의 테이블에 모든 정보를 포함하지 않고, 데이터의 효율적인 관리를 위해서 몇개의 테이블구조로

나누게 됩니다.  이렇게 구조적으로 나뉜 테이블을 맵핑을 하여 하나의 테이블정보인것처럼 처리를 하려면 SQL문에서는 JOIN문으로 해결하며

JPA 객체처리모델에서는 SQL문의 JOIN문에서 해방을 하여 동일한 효과를 내려고 합니다.

그 목적을 달성하기위해 데이터베이스와 객체지향의 몇가지 차이점을 알아야합니다.

Code Block
languagejava
themeEmacs
class User{
	int id;
	string name;
	string email;
}


class ClickLog{
	int clickid;
	User user;  //데이터베이스에서는 userid가 저장됨
	string clickurl;	
}



  • 프로그래밍모델에서 객체는 일반적으로 단방향 접근이 허용이 됩니다. ( ClickLog→ User )
  • 데이터 베이스는 Join문을 통해 양방향 접근이 가능합니다.( User ↔ ClickLog )
  • 프로그래밍 모델에서는 상속의 개념이 있지만, 데이터베이스 에서는 존재하지 않습니다. 


이와같은 차이를 극복하고, 데이터베이스의 Table을 객체지향적 인 모델로 변경을 하려면 JPA에서 지원하는

관계(Join)을 형성하는 몇가지 키워드의 의미를 알아야합니다.

  • ManyToOne : 다대일 관계 매칭정보
  • JoinColumn : 외래키를 매핑때 사용함
  • mappedBy : 연관관계설정시 주인이 아님을 설정
  • OneToMany : 일대다 관계 매핑정보
  • OneToOne : 일대일 관계 매칭정보, 어느곳이나 외래키를 가짐
  • ManyToMany : 다대다 관계매칭정보, 맵핑테이블을 만들어서 사용하기를 권장
  • 연관관계주인 : 외래키가 있는곳이 주인이며 주인만이 수정가능 아닌경우 조회만가능