초급자를 위해 준비한
[웹 개발, 백엔드] 강의입니다.
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다.
✍️
이런 걸
배워요!
예제를 만들면서 자연스럽게 스프링을 이해할 수 있습니다.
스프링을 어떻게 공부해야 하는지 예제를 만들면서 자연스럽게 배울 수 있습니다.
스프링으로 웹 애플리케이션을 만드는 방법을 배울 수 있습니다.
스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다.
???? 확인해주세요!
본 강의는 자바 스프링 완전 정복 시리즈의 첫 번째 강의입니다. 우아한형제들 최연소 기술이사 김영한의 스프링 완전 정복 로드맵을 먼저 확인해주세요.
• 로드맵 링크: 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
댓글 ( 4)
댓글 남기기