2 분 소요

 인프런 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술편을 학습하고 정리한 내용 입니다.

로그인 요구사항

  • 홈 화면 - 로그인 전
    • 회원 가입
    • 로그인
  • 홈 화면 - 로그인 후
    • 본인 이름 (ㅇㅇ님 환영합니다.)
    • 상품 관리
    • 로그 아웃
  • 보안 요구 사항
    • 로그인 사용자만 상품에 접근하고, 관리할 수 있음
    • 로그인 하지 않은 사용자가 상품 관리에 접근하면 로그인 화면으로 이동
  • 회원 가입, 상품 관리

프로젝트 생성

강의에서 제공하는 login-startlogin으로 바꾸고

나는 jdk 21, spring boot 3.2.x 를 사용했기 때문에 약간의 설정을 바꿔 준다.

전체 코드는 깃허브 링크를 확인.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
plugins {  
    id 'java'  
    id 'org.springframework.boot' version '3.2.5'  
    id 'io.spring.dependency-management' version '1.1.4'  
}  
  
group = 'hello'  
version = '0.0.1-SNAPSHOT'  
  
java {  
    sourceCompatibility = '21'  
}  
  
configurations {  
    compileOnly {  
       extendsFrom annotationProcessor  
    }  
}  
  
repositories {  
    mavenCentral()  
}  
  
dependencies {  
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'  
    implementation 'org.springframework.boot:spring-boot-starter-web'  
    compileOnly 'org.projectlombok:lombok'  
    annotationProcessor 'org.projectlombok:lombok'  
    testImplementation 'org.springframework.boot:spring-boot-starter-test'  
    implementation 'org.springframework.boot:spring-boot-starter-validation'  
  
}  
  
tasks.named('test') {  
    useJUnitPlatform()  
}

build.gradle 을 바꿔주고,

javaxjakarta로 변경했다. 다른 곳에도 javaxjakarta 있는지 확인하고 바꿔준다.

실행하면 HomeController에서 /itemsredirect한다.

패키지 구조 설계

  • hello.login
    • domain
      • item
      • member
      • login
    • web
      • item
      • member
      • login

도메인이 가장 중요하다.

도메인 = 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함.

향후 web을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다.

이렇게 하려면 web은 domain을 알고 있지만 domain은 web을 모르도록 설계해야 한다.

이것을 web은 domain을 의존하지만, domain은 web을 의존하지 않는다고 표현한다.

예를 들어 web 패키지를 다 지워도 domain에는 영향이 없어야 한다.

타임리프를 쓰다가 다 api로 바꾸고 프론트 서버에 연결 해도 잘 야 한다.

홈 화면

홈 화면을 개발하자.

HomeController - home() 수정

1
2
3
4
5
6
7
8
9
@Slf4j  
@Controller  
public class HomeController {  
  
    @GetMapping("/")  
    public String home() {  
        return "home";  
    }  
}

login/src/main/resources/templates/home.html 홈 화면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE HTML>  
<html xmlns:th="http://www.thymeleaf.org">  
<head>  
    <meta charset="utf-8">  
    <link th:href="@{/css/bootstrap.min.css}"  
          href="../css/bootstrap.min.css" rel="stylesheet">  
</head>  
<body>  
  
<div class="container" style="max-width: 600px">  
    <div class="py-5 text-center">  
        <h2>홈 화면</h2>  
    </div>  
  
    <div class="row">  
        <div class="col">  
            <button class="w-100 btn btn-secondary btn-lg" type="button"  
                    th:onclick="|location.href='@{/members/add}'|">  
                회원 가입  
            </button>  
        </div>  
        <div class="col">  
            <button class="w-100 btn btn-dark btn-lg" onclick="location.href='items.html'"  
                    th:onclick="|location.href='@{/login}'|" type="button">  
                로그인  
            </button>  
        </div>  
    </div>  
  
    <hr class="my-4">  
  
</div> <!-- /container -->  
  
</body>  
</html>

댓글남기기