관심쟁이 영호

[#16] Spring Boot ㅣ 완성한 프로젝트 기초부터 전부 뜯어보기 본문

Bank-End/인프런- Spring 공부

[#16] Spring Boot ㅣ 완성한 프로젝트 기초부터 전부 뜯어보기

관심쟁이 영호 2021. 4. 29. 01:25
반응형

이제부터는 모든 코드를 하나하나 뜯어보고, 어떤일이 일어나있는 지, 왜 그렇게 되는지 완벽하게 분해분석을 할 예정이다.

 

1. H2 서버를 시작해주고, 프로젝트를 실행해준다.

 

- 해당 내용에 대한 설정은, application.yml에 표시되어 있다.

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

- 여기서 url로 설정되어 있다.

 

2. url : localhost:8080으로 접속해준다. 그럼 홈화면이 뜬다.

-  왜 localhost:8080인가?

이 이유는 yml에 설정이 되어 있기 때문이다. yml에 server.port에 대한 설정이 없으면 기본 루트 값인, 8080포트로 향하도록 설정이 된다. 설정을 바꾸려면 아래와 같이 yml에 표시해준다.

server:
  port: 8081
  context-path: /book

이렇게 설정하면 우리는 localhost:8080이 아닌

localhost:8081/book

이렇게 해야 홈화면을 접속할 수 있을 것이다.

 

- 접속했을 때, 왜 홈화면이 나오는가?

이 이유는 localhost:8080에 해당하는 url에 RequestMapping을 해놓았기 때문이다. 아래의 코드를 보면 알 수 있다.

@Controller
@Slf4j
public class HomeController {

    @RequestMapping("/")
    public String home(){
        log.info("home controller");
        return "home";
    }
}

여기서 RequestMapping("/")이 무슨 말이냐면, 

서버에게 요청이 "localhost:8080/"으로 올 경우

resource폴더에 있는 home.html을 리턴해주라는 뜻이다.

 

Spring은 해당 폴더를 접근하도록 기본 설정이 되어있다.

templates의 home.html을 찾아서 리턴해주게 된다.

(static을 찾아가도록 설정되어있다고 들었는데, 음.. 여기는 공부를 해야겠다.)

 

3. 각 버튼을 누르면 이동된다.

- 그럼 어디에 이동하도록 설정되어 있나?

먼저 이것은 home.html을 살펴보아야 한다.

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header">
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div class="container">
    <div th:replace="fragments/bodyHeader :: bodyHeader" />
    <div class="jumbotron">
        <h1>HELLO SHOP</h1>
        <p class="lead">회원 기능</p>
        <p>
            <a class="btn btn-lg btn-secondary" href="/members/new">회원 가입</a>
            <a class="btn btn-lg btn-secondary" href="/members">회원 목록</a>
        </p>
        <p class="lead">상품 기능</p>
        <p>
            <a class="btn btn-lg btn-dark" href="/items/new">상품 등록</a>
            <a class="btn btn-lg btn-dark" href="/items">상품 목록</a>
        </p>
        <p class="lead">주문 기능</p>
        <p>
            <a class="btn btn-lg btn-info" href="/order">상품 주문</a>
            <a class="btn btn-lg btn-info" href="/orders">주문 내역</a>
        </p>
    </div>
    <div th:replace="fragments/footer :: footer" />
</div> <!-- /container -->
</body>
</html>

여기서 모든 버튼들이 선언되어 있다.

대표적으로 회원가입 버튼을 보자.

회원가입 버튼은 href="/members/new" 라고 설정되어 있다.

해당 버튼을 누르면 서버에 기본설정값 + "/members/new"라고 요청이 된다.

http://localhost:8080/members/new <- 이렇게 요청이 된다.

 

- 요청은 어디에 매핑이 되어있나?

이 요청은 회원가입에 해당하는 Controller에 매핑이 되어 있을 것이다. 코드를 보자.

private final MemberService memberService;

    @GetMapping(value = "/members/new")
    public String createForm(Model model) {
        model.addAttribute("memberForm", new MemberForm());
        return "members/createMemberForm";
    }

    @PostMapping(value = "/members/new")
    public String create(@Valid MemberForm form, BindingResult result) {
        if (result.hasErrors()) {
            return "members/createMemberForm"; //에러가 있으면 BindingResult에서 스프링이 해당 값을 사용할 수 있도록 해준다.
        }
        Address address = new Address(form.getCity(), form.getStreet(),
                form.getZipcode());
        Member member = new Member();
        member.setName(form.getName());
        member.setAddress(address);
        memberService.join(member);
        return "redirect:/";
    }

 

여기서 확인할 수 있다.

해당 코드를 보면 GetMapping과 PostMapping 2개가 있다.

각각 다른 것이다.

회원가입이니까 1개는 회원가입 페이지를 표시, 다른 1개는 회원가입 정보를 입력하고 확인버튼 눌렀을 때의 정보를 넘겨줄 Post매핑일 것이다.

 

앞에 코드에서 RequestMapping을 사용한 것을 살펴볼 수 있다. 근데 @GetMapping과 @PostMapping이 보인다.

그럼 여기서 RequestMapping, GetMapping, PostMapping이 무엇일까?

 

- RequestMapping, GetMapping, PostMapping 차이

@RequestMapping은 @GetMapping, @PostMapping이 나오기 전에 먼저 있던 것이다.

 

아래의 코드를 줄일 수 있는 역할이다.

  • @RequestMapping(value="/", method = { RequestMethod.GET}) -> @GetMapping("/")
  • @RequestMapping(value="/", method = {RequestMethod.POST}) -> @PostMapping("/")

 

이렇게 줄일 수 있게 되었다.

둘 중 아무거나 사용해도 상관없는데, 뒤에 최신버전으로 나온 것이 더욱 최적화가 잘되어있을 것이다!

그리고 개발자입장에서도 구분하기 편하다.

 

그럼 다음 시간에는 데이터베이스에 테이블들이 어떻게 생성되는지 살펴보자.

 

 

300x250
Comments