본문 바로가기
스프링/JPA

스프링-입문-스프링부트 + JPA

by 공부 안하고 싶은 사람 2021. 4. 16.
반응형

인프런 스프링-입문-스프링부트(김영한) 을 듣고 정리한 내용


dispatcherservlet -> controller 검색 후 view resolver(template엔진사용)에게 -> 없으면 resource 검색 -> 반환

브라우저 <-> 어플리케이션
MessageConverter, JsonConverter, StringConverter

@Service @Repository 사용안하고
@Configuration + @Bean으로 빈등록하면 -> 추후에 인터페이스로 클래스 바꾸기 쉽다

 

통합테스트시 DB데이터 비우기 위해 @Transactional 이용
(@Commit으로 저장할 수 있음)

JDBC -> JdbcTemplate -> JPA -> Spring-Data-JPA

JPA는 기술명세서
Hibernate는 JPA 구현체
Spring Data JPA는 JPA를 편하게쓰기 위한 모듈

 

JDBC -

신경쓰지말자...

JdbcTemplate (like Mybatis)

반복코드 제거

Datasource를 주입받은 JdbcTempate를 주입받기

private final JdbcTemplate jdbcTemplate;

public JdbcTemplateRepository(Datasource datasource) {
    jdbcTemplate = new JdbcTemplate(datasource);
}
...
public Optional<Member> findBy(Long id) {
    List<Member> resuult = jdbcTemplate.qurey("select쿼리", mapper(), id);
    return result.stream().findAny();
}

//new RowMapper<>를 통해 변환하도록
private RowMapper<Member> mapper() {
    return (rs, rowNum) -> {
        Member member = new Member();
        member.setId(rs.getLong("id"));
        member.setName(rs.getString("name"));
        return member;
    }
}

public Member save(Member member) {
    SimpleJdbcInsert jdbcIsert = new SimpleJdbcInsert(jdbcTemplate);
    jdbcIsert.withTableName("member").usingGeneratedKeyColumns("id");

    Map<String, Object> parameters = new HasMap<>();
    parameters.pub("name", member.getName());

    Number key = jdbcIsert.excuteAndRetrunKey(new MapSqlParameterSource(parameters));
    member.setId(key.longValue());
    return members;
}        

JPA

EntityManager를 주입받아 사용

EntityManager em;
...
em.persist();em.find(클래스, id);em.createQuery(쿼리, 클래스).getResultList();

Spring-Data-JPA

extends JpaRepository<Class, Id>를 사용시 아래의 인터페이스를 통해 쉽게 JPA 사용가능

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

AOP

@Component
@Aspect
public class TimeTraceAop {
    @Around("execute(* pachage ..*(..))")
    public Object execute(ProceedingJoinPoint jP) throws Throwable {
        long start = System.currrentTimeMillis();
        try {
            return jP.proceed();
        } finally {
            long finish = System.currrentTimeMillis();
            long timeMs = finish - start;
        }
    }
}

임의의 프록시를 생성한 다음, 실행시 jP.proceed()에서 원래를 실행
혹은 컴파일 시, 코드를 추가하는 방법도 존재

728x90
반응형

'스프링 > JPA' 카테고리의 다른 글

JPA 상속 관계 (TABLE_PER_CLASS전략)  (0) 2021.05.21
JPA 활용 1  (0) 2021.04.23
JPA 활용 2  (0) 2021.04.23
자바 ORM 표준 JPA  (0) 2021.04.16
다중 DBconnection (with JPA)  (0) 2021.02.27

댓글