You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
단위테스트가 쪼개고 쪼개 작은 사이즈, SpringTest까지 해야하지 않는 통합테스트가 아닌 테스트가 좋은 테스트일 확률이 많다.
public class SpringConfig {
private DataSource dataSource;
//JDBC 사용 후 DI 주입 @Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource; //다형성활용
// >>OCP 원칙
}
}
JPA
//application.properticesspring.jpa.show-sql=true// jpa가 날리는 sql를 볼 수 있음spring.jpa.hibernate.ddl-auto=none//자동으로 테이블 생성(create)
external libraries 에 확인 : jpa, hibernate
JPA : 표준 인터페이스, 객체랑 orm(Object-Relation-Mapping: annotation) 기술
구현체 : 하이버네이트 (업체마다 다른 장단점이 있음)
ackagebasic.spring.domain;
importjakarta.persistence.Entity;
@Entity//JPA가 관리하는 Entity라는 표현publicclassMember {
@Id@GeneratedValue(strategy = GenerationType.IDENTITY) //PK : DB에서 값을 생성해주는 것, 전략 : 자동 생성 : IDENTITYprivateLongid;
privateStringname;
publicLonggetId() {
returnid;
}
publicStringgetName() {
returnname;
}
publicvoidsetId(Longid) {
this.id = id;
}
publicvoidsetName(Stringname) {
this.name = name;
}
}
packagebasic.spring.repository;
importbasic.spring.domain.Member;
importjakarta.persistence.EntityManager;
importjava.util.List;
importjava.util.Optional;
publicclassJpaMemberRepositoryimplementsMemberRepository{
privatefinalEntityManagerem; //jpa 라이브러리 받은 것을 injection하면 된다.publicJpaMemberRepository(EntityManagerem) {
this.em = em;
}
@OverridepublicMembersave(Membermember) {
em.persist(member);
returnmember;
}
@OverridepublicOptional<Member> findById(Longid) {
Membermember = em.find(Member.class, id);
returnOptional.ofNullable(member);
}
@OverridepublicOptional<Member> findByName(Stringname) {
List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class).setParameter("name",
name).getResultList();
returnresult.stream().findAny();
}
@OverridepublicList<Member> findAll() {
returnem.createQuery("select m from Member m", Member.class).getResultList();
}
}
JPA 를 쓰려면 EntityManager 를 주입받아야 한다.
EntityManager 는 Spring Boot 에서 가지고 있는것인데 내부적으로 데이터 소스를 가지고 있다.
findByAll, findByName : select m from Member m : PK기반이 아닌것들은 JPQL 쿼리언어 작성, 객체(엔티티)를 대상으로 쿼리를 날리는것
pk 기반이 아닌 것들은 JPQL 쿼리 작성해야 한다.
Spring Data JPA는 JPQL 안짜도 된다.
JPA : @transactional 필요 > Service 계층에서(데이터 저장하고 변경할때 필요)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
H2 데이터베이스 설치
순수 JDBC
public class SpringConfig {
private DataSource dataSource;
//JDBC 사용 후 DI 주입
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource; //다형성활용
// >>OCP 원칙
}
}
JPA
external libraries 에 확인 : jpa, hibernate


select m from Member m: PK기반이 아닌것들은 JPQL 쿼리언어 작성, 객체(엔티티)를 대상으로 쿼리를 날리는것이후 Test 쿼리 돌렸을때

Test 통과 확인! Hibernate에서 돌리는 쿼리문을 콘솔에서 볼 수 있다.
한번 더 확인하고 싶으면 test 돌리기 전에
@Commit 써서 확인하면,
(test 전체 코드)
Spring Data JPA
Spring Data JPA가 JPA 기술을 가져다 쓰는 것이므로 로그가 똑같이 나온다.
import org.springframework.data.jpa.repository.JpaRepository; 를 보고 JpaRepository에 가보면 기본 메서드들이 다 구현되어 있다.
그리고 그 중에 PagingANdSortingRepository도 Page 구현 다 되어있음
CRUD Repository에 가면 save, findById, delete 등 다 제공이 된다.
조금 옛날 버전,
select m from Member m where m.name = ?식으로 짜준다.Beta Was this translation helpful? Give feedback.
All reactions