Why TodoList?
인프런 기초 강의를 듣고 아 이제 본격적으로 뭔가를 해볼까? 했는데 배운것을 어떻게 써야할지 도저히 감이 오지 않았다. 그래서 떠오른 생각,, 클론코딩을 해보자
그렇게 초보자들이 많이 만들어본다는 TodoList 를 만들어 보았다.
참고 영상 링크
준비물
나는 웹개발자 과정을 수강하면서 롬복, MySQL JDBC connector, 톰캣 등이 설치 된 상태였다. 안했을 경우, 미리 설치해주자
준비과정
먼저 아래 페이지에 들어가서 아래와 같이 입력해준다.
Zip 파일을 풀고, 적절한 directory 에 package 를 이동한다.
인텔리제이에서 builde.gradle 파일을 열어야한다.
build.gradle 파일 설정
강사님과 똑같이 버전을 2.7.3 으로 낮춰주었다.
build.gradle 파일을 수정했다면 항상 이 버튼을 눌러서 필요한 것들을
다시 다운 받을 수 있게 해주자.
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.3'
id 'io.spring.dependency-management' version '1.0.13.RELEASE'
}
group = 'cloneCoding'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
Java
복사
application.properties
이 파일은 스프링부트가 application 을 구동할 때 자동으로 로딩하는 파일이다.
강의에서는 이 파일을 application.yml 로 바꿔주었다.
.properties 와 .yml 의 차이
.properties
•
resource 디렉토리 하위에 자동으로 생성되는 파일이다.
•
.properties 파일의 포맷은 name=value 형식이다.
application.yml
•
properties 파일과 달리 계층 구조 형식으로 값을 지정할 수 있고, prefix의 중복 제거가 가능하다.
계층 구조 형식
•
.yml 파일을 사용하기 위해서는 SnakeYAML 라이브러리가 포함되어야 하고, 일반적으로 spring-boot-starter의 의존성은 기본적으로 제공해준다.
application.yml
Spring Data Source 설정 - MySQL DB 접속 정보 설정
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/[스키마 이름]?serverTimezone=Asia/Seoul
username: [ID]
password: [비밀번호]
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
format_sql: true
Java
복사
com.mysql.jdbc.Driver 못찾는 경우
•
mysql jdbc connetor 를 설치했고, 라이브러리를 프로젝트에 끌어왔는지 확인
•
끌어왔는데도 인식하지못한다면 build.gradle 파일을 다시 build 해보기
(필자는 이렇게 했을 때 해결이 되었다.)
디렉토리 / 패키지 설명
controller
화면단과 비즈니스 모델을 연결해주는 역할을 한다.
domain
DB 처리용으로 테이블 컬럼과 완전 동일한 객체의 클래스를 관리하는 package.
repository
JPA 에서 Repository 인터페이스를 생성 한 후에 JpaRepository<entity, 기본키 타입> 을 상속받으면 자동적으로 Create, Read, Update, Delete 가 생성된다.
controller
package cloneCoding.todoList.controller;
import cloneCoding.todoList.domain.TodoDataBase;
import cloneCoding.todoList.repository.TodoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
// Spring MVC : 브라우저와 서버가 통신을 하기 위한 기술
@Controller
@RequiredArgsConstructor
public class TodoListController {
private final TodoRepository todoRepository;
@GetMapping("/")
// 받은 값을 넘겨줄때는 모델이라는 객체가 필요하다
public String index(Model model) {
List<TodoDataBase> todoDataBaseList = todoRepository.findAll();
// todo 라는 변수에 리스트의 값을 저장할 것이다.
model.addAttribute("todo", todoDataBaseList);
// 이 값을 todo.html 에 리턴할 것이다.
return "todo";
}
@PostMapping("/addTodo")
public String addTodo(@RequestParam("todoList") String todo) {
// database 에 저장한다.
// entity 객체
TodoDataBase todoData = new TodoDataBase();
// 만든 인스턴스에 todo 에서 받은 값을 입력해준다.
todoData.setTodo(todo);
// toddrepository 에 저장
todoRepository.save(todoData);
return "redirect:/";
}
}
Java
복사
TodoDataBase
packagecloneCoding.todoList.domain;
importcom.sun.istack.NotNull;
importlombok.AllArgsConstructor;
importlombok.Getter;
importlombok.NoArgsConstructor;
importlombok.Setter;
importjavax.persistence.*;
@Entity(name = "TodoDB")//device info entity
@Table(name = "todoList")//device info
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
public classTodoDataBase{
@Id
@GeneratedValue(strategy =GenerationType.IDENTITY)
privateLongid;
@NotNull
privateStringtodo;
}
Java
복사
TodoRepository
package cloneCoding.todoList.repository;
import cloneCoding.todoList.domain.TodoDataBase;
import org.springframework.data.jpa.repository.JpaRepository;
// entity 를 이용하여 입력, 수정, 삭제를 도와주는 interface 이다.
public interface TodoRepository extends JpaRepository<TodoDataBase, Long> {
}
Java
복사
Todo.html
아직 배우는 단계이니 말이 이상해도 양해 부탁 드립니다.
<!doctypehtml>
<htmllang="ko">
<head>
<metacharset="UTF-8">
<metaname="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<metahttp-equiv="X-UA-Compatible"content="ie=edge">
<title>MyFirstTodoList</title>
</head>
<body>
<h1>Todo List</h1>
<!-- todoList 에 text 형식으로 값을 넣고 submit 을 누르면 Todoo 값을 post 형식으로 /addTodo 에 넣어주겠다 라는 뜻이다.-->
<formmethod="post"action="/addTodo">
<inputtype="text"name="todoList" />
<inputtype="submit"value="Add Todo" />
</form>
<h1>
<url>
<!-- controller 에서 todo 라는 자원을 받아 todo 라는 이름으로 내보낼것 -->
<lith:each="todo : ${todo}">
<!-- todo 의 값을 읽어들일 것이다. -->
<spanth:text="${todo.todo}"></span>
</li>
</url>
</h1>
</body>
</html>
HTML
복사
완성본