스프링

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

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

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

✍️
이런 걸
배워요!

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

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

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

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

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

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

 

 

 

소스 :

 

 

 

[1] 강의 소개

 

1.강의 소개

 

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49603?tab=curriculum

 

 

 

2.강의 소개

 

 

강의 :

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49605?tab=curriculum

 

# 버전 수정 이력

## 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.프로젝트 생성

강의 :

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/48553?tab=curriculum

 

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.라이브러리 살펴보기

 

강의 :

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49571?tab=curriculum

 

 

 

 

 

 

 

 

 

 

 

 

5.View 환경설정

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49573?tab=curriculum

 

스프링부트 문서

:

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.빌드하고 실행하기

 

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49574?tab=curriculum


 

 

./gradlew build


빌드후 라이브러리 이동

cd  ./build/lib

java -jar hello-spring-0.0.1-SNAPSHOT.jar 

 

 

잘 안될 경우

./gradlew clean build

 

 

 

 

 

 

[3] 스프링 웹 개발 기초

 

 

7.정적 컨텐츠

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49576?tab=curriculum

 

 

 

 

8.MVC와 템플릿 엔진

 

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49577?tab=curriculum

 

 

 

 

 

 

 

 

 

 

9.API

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49578?tab=curriculum

 

 

 

 

   @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.비즈니스 요구사항 정리

 

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49580?tab=curriculum

 

 

 

 

 

 

 

 

 

 

 

 

11.회원 도메인과 리포지토리 만들기

 

강의:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49581?tab=curriculum

 

 

 

 

 

 

12.회원 리포지토리 테스트 케이스 작성

 

강의:

 

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

 

 

 

 

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() {
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

천하를 돌아다니면서 세상을 걱정했다. 유교의 도리를 제후에 널리 펴고 다녔지만, 목적은 도탄에 빠진 백성들을 건지고 싶은 데 있었다. -맹자

댓글 ( 4)

댓글 남기기

작성