스프링

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49582?tab=curriculum스프링-입문-스프링부트/unit/49582?tab=curriculum

초급자를 위해 준비한
[웹 개발, 백엔드] 강의입니다.

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다.

✍️
이런 걸
배워요!

예제를 만들면서 자연스럽게 스프링을 이해할 수 있습니다.

스프링을 어떻게 공부해야 하는지 예제를 만들면서 자연스럽게 배울 수 있습니다.

스프링으로 웹 애플리케이션을 만드는 방법을 배울 수 있습니다.

스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다.

???? 확인해주세요!
본 강의는 자바 스프링 완전 정복 시리즈의 첫 번째 강의입니다. 우아한형제들 최연소 기술이사 김영한의 스프링 완전 정복 로드맵을 먼저 확인해주세요.
• 로드맵 링크: https://www.inflearn.com/roadmaps/373 (클릭하면 바로가기)

김영한의 스프링 입문
코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

 

 

강의 교재:

https://github.com/braverokmc79/DiagramPDF/blob/main/springboot.pdf

 

 

 

소스 :

https://github.dev/braverokmc79/hello-spring

 

 

 

 

 

 

 

[7] 스프링 DB 접근 기술

 

 

21.H2 데이터베이스 설치

 

강의:

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49593?tab=curriculum

 

 

 

=>

H2 Database 설치, 서버 실행, 접속 방법 (Windows, MacOS)

H2 데이터베이스는 설치가 필요 없고 용량이 매우 가벼우며 웹용 콘솔(쿼리툴)을 제공하여 개발용 로컬 DB로 사용하기 좋은 데이터베이스이다. H2의 특징을 정리하면 다음과 같다.

 

  • Java로 작성된 오픈소스 RDBMS
  • 스프링 부트가 지원하는 인메모리 관계형 데이터베이스이다.
  • 인메모리로 띄우면 애플리케이션을 재시작할 때마다 초기화된다.
  • 별도의 설치가 필요 없다.
  • 로컬 환경, 테스트 환경에서 많이 사용된다.

 

 

1. H2 데이터베이스 다운로드

http://h2database.com에 들어가서 All Platforms를 클릭한다.

 

~

 

저장한 설정: Generic H2 (Server)

JDBC URL: jdbc:h2:tcp://localhost/~/test

를 입력하고 연결을 클릭한다.

 

데이터베이스 파일을 생성한 다음에 JDBC URL을 저렇게 변경하는 이유는 파일 직접 접근이 아닌 TCP 소켓을 통해 접속해야 어플리케이션과 콘솔이 동시에 접근했을 때 오류가 발생하지 않기 때문이다.

 

 

drop table if exists member CASCADE;
create table member
(
 id bigint generated by default as identity,
 name varchar(255),
 primary key (id)
);

 

 

 

 

 

 

 

 

 

22.순수 JDBC

 

 

강의:

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49594?tab=curriculum

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

22.스프링 통합 테스트

 

강의 :

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49595?tab=curriculum

 

 

 

 

 

 

23.스프링 JdbcTemplate

 

강의 :

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49596?tab=curriculum

 

JdbcTemplateMemberRepository

package hello.hellospring.reository;

import hello.hellospring.domain.Member;
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 org.springframework.stereotype.Repository;

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


@Repository
public class JdbcTemplateMemberRepository implements MemberRepository{

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public JdbcTemplateMemberRepository(DataSource dataSource){
        jdbcTemplate =new JdbcTemplate(dataSource);
    }



    @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());
        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 List<Member> findAll() {
        return jdbcTemplate.query("select * from member", memberRowMapper());
    }



    @Override
    public Optional<Member> findByName(String name) {
        return Optional.empty();
    }


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


    @Override
    public void clearStore() {
        jdbcTemplate.update("delete from member");
    }

}

 

 

 

 

 

 

 

 

 

24.JPA

 

강의 :

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49597?tab=curriculum

 

 

 

 

JpaMemberRepository
 

package hello.hellospring.reository;

import hello.hellospring.domain.Member;
import jakarta.persistence.EntityManager;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
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();
    }

    @Override
    public void clearStore() {

    }
}

 

 

 

 

 

 

 

 

25.스프링 데이터 JPA

 

강의 :

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49598?tab=curriculum

 

SpringDataJpaMemberRepository
 

package hello.hellospring.reository;

import hello.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;


public interface SpringDataJpaMemberRepository  extends JpaRepository<Member, Long>{

    Optional<Member> findByName(String name);

    Optional<Member> findById(Long name);
}

 

 

MemberService

 

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.reository.SpringDataJpaMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

@Transactional
@Service
public class MemberService {


//    private JdbcTemplateMemberRepository  memberRepository;
//
//    @Autowired
//    public  MemberService (JdbcTemplateMemberRepository memberRepository) {
//        this.memberRepository=memberRepository;
//    }

//    private JpaMemberRepository memberRepository;
//
//    @Autowired
//    public  MemberService (JpaMemberRepository memberRepository) {
//        this.memberRepository=memberRepository;
//    }


    private SpringDataJpaMemberRepository memberRepository;


    @Autowired
    public  MemberService (SpringDataJpaMemberRepository memberRepository) {
        this.memberRepository=memberRepository;
    }

    /**
     * 회원가입
     * @param member
     * @return
     */
    public Long join(Member member){
        //같은 이름이 있는 중복 회원 x
        extracted(member);
        memberRepository.save(member);
        return member.getId();
    }

    private void extracted(Member member) {
        memberRepository.findByName(member.getName()).ifPresent(m->{
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        });
    }


    /**
     * 전체 회원 조회
     * @return
     */
    public List<Member> findMembers(){
       return memberRepository.findAll();

    }


    public Optional<Member> findOne(Long id){
        return   memberRepository.findById(id);
    }




}







 

 

 

 

 

 

 

26.AOP가 필요한 상황

 

강의 :

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49600?tab=curriculum

 

 

 

 

 

 

 

27.AOP적용

 

강의 :

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49601?tab=curriculum

 

 

 

 

 

 

 

 

 

 

28.다음으로

 

강의 :

 

https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49607?tab=curriculum

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

여자란 남자에게 있어서 경작지이다. 그러므로 원하는 대로 일구어라. -마호메트

댓글 ( 4)

댓글 남기기

작성