이번에는 관리자의 비밀번호를 변경해볼 것입니다. 이를 위해서 저장프로시저를 2개 생성할 것이고, 관련 코드들을 작성해보겠습니다. 코드들이 이전과 비슷하지만, 조금씩 다들 부분들이 있으니 주의해서 봐주세요.

그리고, 이 튜토리얼의 소스는  https://github.com/gauryan/springboot2-tutorial 에서도 확인할 수 있습니다.

1. 저장 프로시저 (SP_GET_ADMIN) 생성 (1명의 관리자 정보를 가져옴)

CREATE PROCEDURE SP_GET_ADMIN(i_id INT)
BEGIN
  SELECT id, userid, password, nick FROM TB_ADMIN WHERE id = i_id LIMIT 1;
END


mysql> CALL SP_GET_ADMIN(2);
+------+---------+----------+-------+
| id   | userid  | password | nick  |
+------+---------+----------+-------+
|    2 | testid2 | passwd2  | nick2 |
+------+---------+----------+-------+


2. src/main/resources/templates/mgmt/admin/chg_passwd_form.html 파일을 생성한다. 비밀번호 변경하기 위한 폼을 출력한다.

<div class="modal-header">
  <h5 class="modal-title">관리자 비밀번호 변경</h5>
  <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
  <form name="chg_passwd_form" action="/mgmt/admin/chg_passwd" method="post">
    <div class="form-group">
      <label>아이디</label>
      <input type="text" name="userid" class="form-control" readonly required value="${admin.userid}"/>
      <input type="hidden" name="id" value="${admin.id}" />
    </div>
    <div class="form-group">
      <label>비밀번호 <small>(필수)</small></label>
      <input type="password" name="passwd1" class="form-control" required />
    </div>
    <div class="form-group">
      <label>비밀번호 확인 <small>(필수)</small></label>
      <input type="password" name="passwd2" class="form-control" required />
    </div>
    <div class="form-group" style="text-align: right">
      <input class="btn btn-primary" type="submit" value="관리자 비밀번호 변경" />
    </div>
  </form>
</div>

 

3. src/main/resources/mybatis-mapper/AdminMapper.xml에 다음을 추가합니다.

...    
    <select id="getAdmin" resultType="Admin">
        CALL SP_GET_ADMIN(#{id})
    </select>
...

 

4. src/main/java/com/tutorial/xyz/mapper/AdminMapper.java 파일에 다음을 추가한다. 위츼 XML파일을 사용하지 않으려면, @Select 어노테이션의 주석을 풀어주면 됩니다.

  // @Select("SELECT id, userid, password, nick FROM TB_ADMIN WHERE id = #{id}")
  // @Select("CALL SP_GET_ADMIN(#{id})")
  Admin getAdmin(@Param("id") Long id);

 

5. src/main/java/com/tutorial/xyz/controller/mgmt/AdminController.java 파일에 다음을 추가한다. URL에 포함된 변수값(id)을 받기 위해서 @PathVariable 어노테이션을 이용하였다.

  // 관리자 비밀번호 변경 폼
  @GetMapping("/admin/chg_passwd_form/{id}")
  public String chgPasswdForm(@PathVariable("id") Long id, Model model) {
    Admin admin = mapper.getAdmin(id);
    model.addAttribute("admin", admin);
    return "mgmt/admin/chg_passwd_form";
  }

 
6. 이제, 비밀번호변경 버튼을 클릭하면 비밀번호변경을 위한 모달 다이얼로그박스가 나타날 것이다.


7. 실제로 비밀번호를 변경하는 작업을 해보자. 우선 저장 프로시저 (SP_UPDATE_ADMIN_PASSWORD) 생성하자.

CREATE PROCEDURE SP_UPDATE_ADMIN_PASSWORD (
    i_id INT,
    i_password VARCHAR(255))
BEGIN
    UPDATE TB_ADMIN SET password = i_password WHERE id = i_id;
END




mysql> CALL SP_LIST_ADMIN();
+-----+---------+----------+-------+
| sno | userid  | password | nick  |
+-----+---------+----------+-------+
|   1 | testid1 | passwd1  | nick1 |
|   2 | testid2 | passwd2  | nick2 |
|   3 | testid3 | passwd3  | nick3 |
|   4 | testid4 | passwd4  | nick4 |
|   5 | testid5 | passwd5  | nick5 |
|   9 | testid6 | passwd6  | nick6 |
+-----+---------+----------+-------+
 
mysql> CALL SP_UPDATE_ADMIN_PASSWORD (1, 'passwd101');
 
mysql> CALL SP_LIST_ADMIN();
+-----+---------+-----------+-------+
| sno | userid  | password  | nick  |
+-----+---------+-----------+-------+
|   1 | testid1 | passwd101 | nick1 |
|   2 | testid2 | passwd2   | nick2 |
|   3 | testid3 | passwd3   | nick3 |
|   4 | testid4 | passwd4   | nick4 |
|   5 | testid5 | passwd5   | nick5 |
|   9 | testid6 | passwd6   | nick6 |
+-----+---------+-----------+-------+

 

8. src/main/resources/mybatis-mapper/AdminMapper.xml 파일에 다음을 추가한다. AdminMapper.java 에서 @Update 어노테이션을 사용하는 경우에는 설정하지 않아도 된다.

...
    <update id="updateAdminPassword">
        CALL SP_UPDATE_ADMIN_PASSWORD(#{id}, #{password})
    </update>
...

 

9. src/main/java/com/tutorial/xyz/mapper/AdminMapper.java 파일에 다음을 추가한다.

...
  // @Update("CALL SP_UPDATE_ADMIN_PASSWORD(#{id}, #{password})")
  int updateAdminPassword(@Param("id") Long id, @Param("password") String password);
...


10. src/main/java/com/tutorial/xyz/controller/mgmt/AdminController.java 파일에 다음을 추가한다. Form 값을 받아서 처리하는 방법이 여러가지가 있는데, 여기에서는 가장 간편한 @RequestParam 어노테이션을 이용하였다.

...
  // 관리자 비밀번호 수정
  @PostMapping("/admin/chg_passwd")
  public String chg_passwd(@RequestParam("id") Long id, @RequestParam("passwd1") String passwd1, @RequestParam("passwd2") String passwd2) {
    if(!passwd1.equals(passwd2)) {
      return "redirect:/mgmt/admin";
    }
    mapper.updateAdminPassword(id, passwd1);
    return "redirect:/mgmt/admin";
  }
...


11. 비밀번호를 변경해보고, DB의 내용이 잘 반영되었는지 확인해보자.

mysql> CALL SP_LIST_ADMIN();
+-----+---------+-----------+-------+
| sno | userid  | password  | nick  |
+-----+---------+-----------+-------+
|   1 | testid1 | passwd101 | nick1 |
|   2 | testid2 | passwd2   | nick2 |
|   3 | testid3 | passwd3   | nick3 |
|   4 | testid4 | passwd4   | nick4 |
|   5 | testid5 | passwd5   | nick5 |
|   9 | testid6 | passwd106 | nick6 |
+-----+---------+-----------+-------+



이 튜토리얼의 소스는  https://github.com/gauryan/springboot2-tutorial 에서도 확인할 수 있습니다.

 

관리자 목록을 보았으니, 이제는 새로운 관리자를 추가해봅시다. 

1. 저장 프로시저 (SP_INSERT_ADMIN) 생성

CREATE PROCEDURE SP_INSERT_ADMIN (
    i_userid VARCHAR(255),
    i_password VARCHAR(255),
    i_nick VARCHAR(255))
BEGIN
  INSERT INTO TB_ADMIN(userid, password, nick) VALUES(i_userid, i_password, i_nick);
END


mysql> SELECT * FROM TB_ADMIN;
+-----+---------+----------+-------+
| sno | userid  | password | nick  |
+-----+---------+----------+-------+
|   1 | testid1 | passwd1  | nick1 |
|   2 | testid2 | passwd2  | nick2 |
|   3 | testid3 | passwd3  | nick3 |
|   4 | testid4 | passwd4  | nick4 |
|   5 | testid5 | passwd5  | nick5 |
+-----+---------+----------+-------+

 
mysql> CALL SP_INSERT_ADMIN('testid6', 'passwd6', 'nick6');

 
mysql> SELECT * FROM TB_ADMIN;
+-----+---------+----------+-------+
| sno | userid  | password | nick  |
+-----+---------+----------+-------+
|   1 | testid1 | passwd1  | nick1 |
|   2 | testid2 | passwd2  | nick2 |
|   3 | testid3 | passwd3  | nick3 |
|   4 | testid4 | passwd4  | nick4 |
|   5 | testid5 | passwd5  | nick5 |
|   6 | testid6 | passwd6  | nick6 |
+-----+---------+----------+-------+


2. 관리자 입력 양식을 만들자. src/main/resources/templates/mgmt/admin/insert_form.html

<div class="modal-header">
  <h5 class="modal-title">관리자 추가</h5>
  <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
  <form name="insert_form" action="/mgmt/admin/insert" method="post">
    <div class="form-group">
      <label>아이디 <small>(필수)</small></label>
      <input type="text" name="userid" class="form-control" required>
    </div>
    <div class="form-group">
      <label>비밀번호 <small>(필수)</small></label>
      <input type="password" id="password" name="passwd1" class="form-control" required>
    </div>
    <div class="form-group">
      <label>비밀번호 확인 <small>(필수)</small></label>
      <input type="password" name="passwd2" class="form-control" required>
    </div>
    <div class="form-group">
      <label>별명 <small>(필수)</small></label>
      <input type="text" name="nick" class="form-control" required>
    </div>
    <br>
    <div class="form-group" style="text-align: right">
      <input class="btn btn-primary" type="submit" value="관리자 추가" />
    </div>
  </form>
</div>


3. src/main/java/com/tutorial/xyz/controller/mgmt/AdminController.java 에 다음 코드를 추가한다.

...
 
  // 관리자 추가 폼
  @GetMapping("/mgmt/admin/insert_form")
  public String insertForm() {
    return "mgmt/admin/insert_form";
  }

...


4. 관리자 추가 버튼을 클릭하면 모달 다이얼로그 박스 형식의 입력 양식이 나올 것이다. 여기에서는 bootstrap 과 jquery를 이용해서 Modal 박스를 사용하였다. list.html 하단에 보면 관련 코드들이 있으니 참고 바란다.

 

5. src/main/resources/mybatis-mapper/AdminMapper.xml 파일에 다음을 추가한다. AdminMapper.java 에서 @Insert 어노테이션을 사용하는 경우에는 설정하지 않아도 된다.

...

    <insert id="insertAdmin">
        CALL SP_INSERT_ADMIN(#{userid}, #{password}, #{nick})
    </insert>

...

 

6. src/main/java/com/tutorial/xyz/mapper/AdminMapper.java 파일에 다음을 추가한다.

  // @Insert("CALL SP_INSERT_ADMIN(#{userid}, #{password}, #{nick})")
  int insertAdmin(@Param("userid") String userid, @Param("password") String password, @Param("nick") String nick);

 

7. src/main/java/com/tutorial/xyz/controller/mgmt/AdminController.java 파일에 다음을 추가한다. Form 값을 받아서 처리하는 방법이 여러가지가 있는데, 여기에서는 가장 간편한 @RequestParam 어노테이션을 이용하였다.

  // 관리자 추가
  @PostMapping("/admin/insert")
  public String insert(@RequestParam("userid") String userid, @RequestParam("passwd1") String passwd1, @RequestParam("passwd2") String passwd2, @RequestParam("nick") String nick) {
    String password;
    if(!passwd1.equals(passwd2)) {
      // 비밀번호가 다른 경우, 관리자목록으로 돌아간다.
      return "redirect:/mgmt/admin";
    }
    password = passwd1;
    mapper.insertAdmin(userid, password, nick);
    // 관리자 추가 성공
    return "redirect:/mgmt/admin";
  }

 

8. 코드 작성은 완료되었으니, 실제 화면에서 관리자를 등록해보면 목록에 표시되는 것을 볼 수 있을 것이다.

 


이 튜토리얼의 소스는  https://github.com/gauryan/springboot2-tutorial 에서도 확인할 수 있습니다.

 

1. MySQL(MariaDB)에서 저장 프로시저 (SP_LIST_ADMIN) 생성한다.

CREATE PROCEDURE SP_LIST_ADMIN()
BEGIN
  SELECT id, userid, password, nick FROM TB_ADMIN;
END
CALL SP_LIST_ADMIN();
+-----+---------+----------+-------+
|  id | userid  | password | nick  |
+-----+---------+----------+-------+
|   1 | testid1 | passwd1  | nick1 |
|   2 | testid2 | passwd2  | nick2 |
|   3 | testid3 | passwd3  | nick3 |
|   4 | testid4 | passwd4  | nick4 |
|   5 | testid5 | passwd5  | nick5 |
+-----+---------+----------+-------+

 

2. src/main/resourcesmybatis-mapper 폴더를 생성하고, 그 안에 AdminMapper.xml 파일을 작성한다. MyBatis 에서 사용할 SQL 쿼리문을 정의 하는 파일이다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tutorial.xyz.mapper.AdminMapper">
    <select id="listAdmin" resultType="Admin">
        CALL SP_LIST_ADMIN()
    </select>
</mapper>

 

3. src/main/java/com/tutorial/xyzdto 폴더를 생성하고, 그 안에 Admin.java 파일을 작성한다. 이 파일은 DTO, VO, ENTITY 등으로 불리며, 쿼리 결과를 받는 용도이다. lombok 에서 제공되는 @Data 어노테이션을 사용하면, Getter와 Setter 메소드를 자동생성해주어서, 코드를 깔금하게 유지할 수 있다.

package com.tutorial.xyz.dto;

import lombok.Data;

@Data
public class Admin {
  private Long   id;
  private String userid;
  private String password;
  private String nick;
}

 

4. src/main/java/com/tutorial/xyzmapper 폴더를 생성하고, 그 안에 AdminMapper.java 파일을 작성한다. 이 파일은 MyBatis에서 SQL쿼리와 객체를 연결해주는 역할을 한다. SQL 쿼리가 짧으면, XML파일에 정의하지 않고, 이 파일에서 @Select 어노테이션을 이용해서 SQL쿼리를 작성할 수도 있다. 아무래도 파일이 하나가 줄어드니 더 편하게 작업할 수 있을 것이다. 이 Mapper라고 하는 부분이 다른 언어에서 사용하는 웹프레임워크의 Model에 해당한다고 생각하면 편할 듯 한다.

package com.tutorial.xyz.mapper;

import java.util.List;

import com.tutorial.xyz.dto.Admin;

import org.apache.ibatis.annotations.Mapper;
// import org.apache.ibatis.annotations.Select;

@Mapper
public interface AdminMapper {

  // @Select("CALL SP_LIST_ADMIN()")
  // @Select("SELECT id, userid, password, nick FROM TB_ADMIN")
  List<Admin> listAdmin();
}

 

5. src/main/java/com/tutorial/xyz 에 controller/mgmt 폴더를 생성하고, 그 안에 AdminController.java 파일을 작성한다. 특정 URL을 요청하면 동작하는 method를 정의하는 부분이다. @Controller 어노테이션을 사용해야 하며, 호출될 Method 위에는 @GetMapping 어노테이션을 이용해서 URL을 지정한다. 그리고, 앞에서 만들어 놓은 AdminMapper를 통해서 DB에 접근할 수 있다. Mapper 와 Controller 사이에 Service 레이어를 추가하는 경우가 많은데, 특별한 목적이 있지 않으면 복잡도만 증가시킨다고 판단하여 작성하지 않았다.

package com.tutorial.xyz.controller.mgmt;

import java.util.List;

import com.tutorial.xyz.dto.Admin;
import com.tutorial.xyz.mapper.AdminMapper;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/mgmt")
public class AdminController {

  private AdminMapper mapper;

  public AdminController(AdminMapper mapper) {
    this.mapper = mapper;
  }

  // 관리자 목록
  @GetMapping("/admin")
  public String list(Model model) {
    List<Admin> admins = mapper.listAdmin();
    model.addAttribute("admins", admins);

    return "mgmt/admin/list";
  }

}

 

6. src/main/resources/templatesmgmt 폴더를 생성하고 layout.html 파일을 작성한다. 파일이름처럼 layout을 위한 파일이며, content 부분에 다른 파일들의 내용이 채워질 것이다. head 태그 안에는 jquery 와 bootstrap 관련 항목이 포함되어 있다.

<!DOCTYPE html>
<html lang="ko" 
  xmlns:th="http://www.thymeleaf.org" 
  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
  <title>Spring Tutorial</title>
</head>
<body>
  <th:block layout:fragment="content"></th:block>
</body>
</html>

 

7. src/main/resources/templates/mgmt 에 admin 폴더를 생성하고, 그 안에 list.html 파일을 작성한다. Thymeleaf로 작성된 HTML 템플릿이다. 관리자 목록을 출력해주고 있다. HTML태그에서는 어떤 layout 파일을 사용할지 지정하고 있다. mgmt폴더 아래에 있는 layout.html 을 레이아웃으로 지정하고 있는 것이다. 이 외에도 Thymeleaf 태그들이 어떻게 사용되고 있는지 유심히 볼 필요가 있다. 아랫 부분에는 Modal 다이얼로그를 위한 부분도 있는데, bootstrap 과 jquery 를 이용한다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{mgmt/layout}">

<th:block layout:fragment="content">
  <div class="container-fluid">
    <h2>관리자 목록</h2>
    <div style="text-align: right;">
      <a href="javascript:show_dialog('/mgmt/admin/insert_form');" class="btn btn-sm btn-outline-dark">관리자 추가</a>
    </div>
    <table class="table table-hover">
      <thead>
        <tr>
          <th style="text-align: center;">아이디</th>
          <th style="text-align: center;">별명</th>
          <th style="text-align: center;">수정/삭제</th>
        </tr>
      </thead>
      <tbody>
        <tr th:each="admin : ${admins}">
          <td style="text-align: center;" th:text="${admin.userid}"></td>
          <td style="text-align: center;" th:text="${admin.nick}"></td>
          <td style="text-align: center;">
            <div class="btn-group" role="group" >
              <a th:href="|javascript:show_dialog('/mgmt/admin/chg_passwd_form/${admin.id}');|" class="btn btn-sm btn-secondary">비밀번호변경</a>
              <a th:href="|javascript:show_dialog('/mgmt/admin/update_form/${admin.id}');|" class="btn btn-sm btn-light">수정</a>
              <button th:onclick="|delete_admin('/mgmt/admin/delete/${admin.id}')|" type="button" class="btn btn-sm btn-danger">삭제</button>
            </div>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
  <div id="myModal" class="modal fade" role="dialog" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered">
      <div class="modal-content">
      </div>
    </div>
  </div>

  <script>
    // Modal Remote Reload
    $(document).on('hidden.bs.modal', function (e) {
        $(e.target).removeData('bs.modal');
    })

    function show_dialog(url) {
      $('#myModal .modal-content').load(url, function(e){
          $('#myModal').modal('show');
      });
    }

    function delete_admin(url) {
        var result = confirm("관리자를 정말로 삭제하시겠습니까?");
        if( result == false ) return;
        location.href = url;
    }
  </script>
</th:block>

</html>


9. 이제, 웹브라우저에서 http://localhost:8080/mgmt/admin 에 접속하면 관리자 목록을 볼 수 있을 것이다. 여기까지 성공했으면, Tutorial 프로젝트의 50% 이상을 진행한 것이나 마찬가지다. ^^




 

이 튜토리얼의 소스는  https://github.com/gauryan/springboot2-tutorial 에서도 확인할 수 있습니다.

 

Spring 프로젝트를 생성하려면 https://start.spring.io/ 사이트에 가서 필요한 항목을 입력하고, 프로젝트 파일을 다운로드 받아야 한다. 아래 이미지를 보면, 분홍색 박스로 어떤 것을 선택하고 입력했는지 확인할 수 있습니다. 이대로 선택한 뒤에, GENERATE 버튼을 눌러주시면, xyz.zip 파일을 다운로드 받게 됩니다. 참고로, Eclipse(STS), VSCode 를 사용하면 이 사이트에 방문하지 않고 IDE내에서 같은 옵션으로 프로젝트 생성이 가능하다. IntelliJ도 구매하면 프로그램에서 프로젝트 생성을 할 수 있다.

다운로드 받은 파일을 적절한 곳에 복사를 하고 풀어주세요. 그리고, IntelliJ를 실행하고, Open 을 클릭해서, 프로젝트 폴더를 선택합니다.

 

프로젝트 폴더를 열면, 필요한 파일들을 자동으로 다운로드 받고, 필요하면 자동으로 빌드도 하는 과정이 한참 진행이 됩니다. 끝날때까지 기다려 주세요. 작업이 마무리 되면, 아래 같이 되는군요!

 

왼쪽창에서 XyzApplication을 더블클릭하면, 파일이 열리면서, 오른쪽 상단에 "Setup JDK"를 클릭하고 "Add JDK..."메뉴를 선택하세요. 그리고, 설치된 JDK폴더를 지정해주세요. 참고로, 저의 JDK는 C:\Program Files\OpenJDK\openjdk-11.0.13_8 에 있습니다.

build.gradle 파일의 dependencies 항목에 thymeleaf-layout-dialect 모듈을 추가해줍니다. thymeleaf 템플릿의 layout 기능을 해주는 모듈입니다.

dependencies {

...

	implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
    
...

}

application.properties 파일에 아래처럼 DB, MyBatis 관련 설정을 해준다.

# ---------------------------------------------------------
# Server
# ---------------------------------------------------------
# server.port=8080
# logging.level.root=info
# spring.resources.static-locations=classpath:/static/

# ---------------------------------------------------------
# MyBatis
# ---------------------------------------------------------
mybatis.mapper-locations=classpath:mybatis-mapper/**/*.xml
# xml파일 result type에 패키지명을 생략할 수 있도록 alias 설정
mybatis.type-aliases-package=com.tutorial.xyz.dto

# ---------------------------------------------------------
# DBMS : MySQL
# ---------------------------------------------------------
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/xyz?useUnicode=yes&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Seoul
spring.datasource.username=xyz
spring.datasource.password=xyz123
spring.datasource.hikari.maximum-pool-size=4

 

이제, 우측 상단에 보면 실행 버튼이 보일 것이다. 이것을 클릭하면, 톰캣서버가 실행되며, 정상적으로 동작한다면, 웹브라우저에서 http://localhost:8080 으로 접속해볼 수 있다.

만약, java.exe'' finished with non-zero exit value 1 에러가 나온다면, 아래 순서대로 해결할 수 있다.

  1. [File > Settings] 메뉴 클릭 (단축키: ctrl + alt + s)
  2. [Build, Execution, Deployment > Build Tools > Gradle] 메뉴로 이동
  3. Build and run using을 IntelliJ IDEA로 변경
  4. Run tests using을 IntelliJ IDEA로 변경
  5. Gradle JVM을 jdk11로 변경 (없다면 설치)

모든 것이 성공했다면, 다음 화면을 볼 수 있을 것이다. *^^* Error Page 를 표시하지만, 아직 페이지를 만든 것이 없으므로, 일단 서버만 돌아간다는 것을 확인하는 것이다. 

 

아무튼, 여기까지 프로젝트를 생성하였고, 톰캣서버도 실행되었으니, IntelliJ 에서 작업할 준비가 되었습니다. VSCode 나 Eclipse(STS)로도 프로젝트를 만들어보세요. 개인적으로는 VSCode가 마음에 드네요. 저는 결국... VSCode 로 작업하고 있습니다. ^^;;;

 

VSCode 에서 Spring Boot 프로젝트를 원활하게 하려면, 아래 확장프로그램을 설치하시면 충분합니다.

+ Recent posts