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