초급자를 위해 준비한
[웹 개발, 백엔드] 강의입니다.
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다.
✍️
이런 걸
배워요!
예제를 만들면서 자연스럽게 스프링을 이해할 수 있습니다.
스프링을 어떻게 공부해야 하는지 예제를 만들면서 자연스럽게 배울 수 있습니다.
스프링으로 웹 애플리케이션을 만드는 방법을 배울 수 있습니다.
스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다.
???? 확인해주세요!
본 강의는 자바 스프링 완전 정복 시리즈의 첫 번째 강의입니다. 우아한형제들 최연소 기술이사 김영한의 스프링 완전 정복 로드맵을 먼저 확인해주세요.
• 로드맵 링크: https://www.inflearn.com/roadmaps/373 (클릭하면 바로가기)
김영한의 스프링 입문
코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
소스 :
[1] 강의 소개
1.강의 소개
강의:
2.강의 소개
강의 :
# 버전 수정 이력 ## v2022-11-28 * 스프링 부트 3.0 내용 추가 * 프로젝트 선택에서 `Gradle - Groovy` 추가 ## v2022-09-04 * 오타 `helloConroller` -> `helloController` (hswkd9895님 도움) * 코드 오타 `template/` -> `templates/` (anthologia님 도움) ## v2021-12-01 *주의!* h2 데이터베이스는 꼭 다음 링크에 들어가서 *1.4.200* 버전을 설치해주세요. 최근에 나온 2.0.206 버전을 설치하면 일부 기능이 정상 동작하지 않습니다. https://www.h2database.com/html/download-archive.html 만약 이미 설치하고 실행까지 했다면 다시 설치한 이후에 *~/test.mv.db* 파일을 꼭 삭제해주세요. 그렇지 않으면 다음 오류가 발생하면서 접속되지 않습니다. General error: "The write format 1 is smaller than the supported format 2 [2.0.206/5]" [50000-202] HY000/50000 ## v2021-07-18
[2] 프로젝트 환경 설정
3.프로젝트 생성
강의 :
build.gradle
plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' } group = 'hello' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
4.라이브러리 살펴보기
강의 :
5.View 환경설정
강의:
스프링부트 문서
:
https://docs.spring.io/spring-boot/docs/3.0.2/reference/htmlsingle/#getting-started
controller
package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HelloController { @GetMapping("hello") public String hello(Model model){ model.addAttribute("data" ,"hello"); return "hello"; } }
html
<!DOCTYPE html> <html lang="ko" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1 th:text="${data}">data</h1> </body> </html>
6.빌드하고 실행하기
강의:
./gradlew build
빌드후 라이브러리 이동
cd ./build/lib
java -jar hello-spring-0.0.1-SNAPSHOT.jar
잘 안될 경우
./gradlew clean build
[3] 스프링 웹 개발 기초
7.정적 컨텐츠
강의:
8.MVC와 템플릿 엔진
강의:
9.API
강의:
@GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name, Model model){ Hello hello =new Hello(); hello.setName(name); return hello; } static class Hello{ private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
[4] 회원 관리 예제 - 백엔드 개발
10.비즈니스 요구사항 정리
강의:
11.회원 도메인과 리포지토리 만들기
강의:
12.회원 리포지토리 테스트 케이스 작성
강의:
MemoryMemberRepositoryTest
package hello.hellospring.repository; import hello.hellospring.domain.Member; import hello.hellospring.reository.MemberRepository; import hello.hellospring.reository.MemoryMemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.util.List; public class MemoryMemberRepositoryTest { MemberRepository repository =new MemoryMemberRepository(); @AfterEach public void afterEach(){ repository.clearStore(); } @Test public void save(){ Member member =new Member(); member.setName("spring"); repository.save(member); Member result =repository.findById(member.getId()).get(); Assertions.assertThat(member).isEqualTo(result); } @Test public void findByNmae(){ Member member1=new Member(); member1.setName("spring1"); repository.save(member1); Member member2=new Member(); member2.setName("spring2"); repository.save(member2); Member result =repository.findByName("spring1").get(); Assertions.assertThat(result).isEqualTo(member1); } @Test public void findAll(){ Member member1 =new Member(); member1.setName("spring1"); repository.save(member1); Member member2 =new Member(); member2.setName("spring2"); repository.save(member2); List<Member> result =repository.findAll(); Assertions.assertThat(result.size()).isEqualTo(2); } }
13.회원 서비스 개발
강의:
https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49583?tab=curriculum
MemberService
package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.reository.MemberRepository; import hello.hellospring.reository.MemoryMemberRepository; import java.util.List; import java.util.Optional; public class MemberService { private final MemberRepository memberRepository =new MemoryMemberRepository(); /** * 회원가입 * @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 memberId){ return memberRepository.findById(memberId); } }
14.회원 서비스 테스트
강의:
https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49584?tab=curriculum
MemberServiceTest
package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.reository.MemberRepository; import hello.hellospring.reository.MemoryMemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class MemberServiceTest { MemberService memberService ; MemberRepository memberRepository; @BeforeEach public void beforeEach(){ memberRepository =new MemoryMemberRepository(); memberService =new MemberService(memberRepository); } @AfterEach public void afterEach(){ memberRepository.clearStore(); } @Test void 회원가입() { //give Member member =new Member(); member.setName("hello"); //when Long saveId =memberService.join(member); //then Member findMember= memberService.findOne(saveId).get(); Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test public void 중복_회원_예외(){ //given Member member1 =new Member(); member1.setName("spring1"); Member member2=new Member(); member2.setName("spring1"); //when memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // try{ // memberService.join(member2); // fail(); // }catch (IllegalStateException e){ // Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // } //then } @Test void findMembers() { } @Test void findOne() { } }
댓글 ( 4)
댓글 남기기