본문 바로가기
Spring/Spring

[inflearn / spring 입문 ] JDBC Template and JPA(*)(+ 추가예정)

by SIXXXX_ 2022. 2. 21.
728x90

쓰이는 단축키(Window)

alt+Enter : 람다식으로 바꿔주는 방법

ctrl+alt+n :인라인 합쳐짐

 

 

JDBC Template import 방법

1. build.gradle에서 implementation 'org.springframework.boot:spring-boot-starter-jdbc' 을

추가해준다.

 

 

(*)디자인 패턴 중 template method 패턴으로 이렇게 줄일 수 있다고 한다.

 

2. JDBCTemplateMemberRepository

package welcome.welcomespring.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import welcome.welcomespring.domain.Member;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class JdbcTemplateMemberRepository implements MemberRepository{


    private final JdbcTemplate jdbcTemplate;

    public JdbcTemplateMemberRepository(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    //생성자 하나만 쓰면 autowired 생략가능

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

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("name", member.getName()); //insert문 만들어짐

        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
        member.setId(key.longValue());
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        List<Member> result = jdbcTemplate.query("select * from member where id= ?", memberRowMapper(), id);
        return result.stream().findAny();
    }

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = jdbcTemplate.query("select * from member where name= ?", memberRowMapper(), name);
        return result.stream().findAny();
    }

    @Override
    public List<Member> findAll() {
        return jdbcTemplate.query("select * from member", memberRowMapper());
    }

    private RowMapper<Member> memberRowMapper() {
        return (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        };
    }
}

 

실행로직

dataSource 를 넣어준다

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository()); //로직을 호출해서 bean에 등록해준다
        // 밑에 메서드 호출
    }

    @Bean
    public MemberRepository memberRepository(){
        return new JdbcTemplateMemberRepository(dataSource);
    }
}

 

 

 

 

 

JPA 란?

 

 

JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.

JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

 

Mybatis와 비교해서 쓰기도 한다.

 

 

application.properties에

 

spring.jpa.show-sql=ture

spring.jpa.hibernate.ddl-auto=none

 

를 추가한다.

 

 

ORM  

Member class에 @Entity 어노테이션 추가

@Id(persistence import 추가)

@GeneratedValue로 Identity

@Column 어노테이션으로 컬럼값 추가

 

package welcome.welcomespring.domain;

import javax.persistence.*;

@Entity
public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    //DB가 알아서 생성 IDENTITY
    private Long id; //시스템상 아이디 식별자
    @Column(name= "userName")
    private String name;

 

JpaMemberRepository

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;


public class JpaMemberRepository implements MemberRepository {


    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }


    @Override
    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class ).setParameter("name", name).getResultList();
        return result.stream().findAny();
    }

    @Override
    public List<Member> findAll() {
        return em.createQuery("select m from Member m ", Member.class).getResultList();
    }
}

 

findAll부분에 "select m(객체자체) from Member as m"

 

 

 

Service에 @Transactional 어노테이션 추가

```java

@Override
public List<Member> findAll() {
    return em.createQuery("select m(객체자체) from Member m (as m )", Member.class).getResultList();
} 
//List<Member> reseult = ;
//return result;
```

 

 

public class SpringConfig {
	private EntityManager em;
	
	@Autowired
	public SpringConfig(EntityManager em) {
	    this.em = em;
	}
	
	@Bean
  public MemberRepository memberRepository(){
      return new JpaMemberRepository();
  }
}

 

 

 

 

 

REFERENCE