삭제 기능 추가하기

 

1. controller에 삭제 메서드 추가

@GetMapping("/delTodo")
    public String delTodo(@RequestParam("delToDo") Long delToDo){
        toDoRepository.deleteById(delToDo);
        return "redirect:/";
    }

 

2. html에 삭제버튼 추가

<li th:each="todo : ${todos}">
      <span th:text="${todo.todo}"></span>
      <a th:href="@{/delTodo(delToDo=${todo.id})}" class="delete-link">&cross;</a>
</li>

- /메서드(파라미터=${데이터 id값}

(데이터베이스의 데이터는 id값을 참조해서 지움)

- &cross 엑스버튼

 

3. 실행 결과

삭제시 데이터베이스 테이블에서도 삭제됨

1.  html 수정

-todo 이름의 값을 submit하면 /addTodo로 post 방식으로 넘겨주기

<html lang="ko"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

    <h1>ToDo App</h1>
    <form method="post" action="/addTodo">
        <input type="text" name="todo" />
        <input type="submit" value="Add Todo" />
    </form>
    <hr>
    <ul>
        <li th:each="todo : ${todos}"> //todos를 하나씩 꺼내서 todo에 담아 
            <span th:text="${todo.todo}"></span> //gettodo메서드로 꺼내서 화면에 출력
        </li>
    </ul>
</html>

2. 항목 추가하는 컨트롤러 생성

-PostMapping

-@RequestParam todo 파라미터 값을 가져와 todo로 저장

3. database에 저장

-JPA domain 생성

package com.example.todoapp.domain;
//이건 클래스임, 데이터베이스를 저장해야 됨
//클래스랑 데이터베이스랑 맵핑해줘야 함

import com.sun.istack.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

@Entity(name = "ToDo")
@Table(name = "todo")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ToDo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String todo;
}
더보기

@Entity 란?

JPA(Java Persistence API)에서 엔티티 클래스임을 정의하는 어노테이션입니다. JPA는 자바 객체와 데이터베이스 테이블 간의 매핑을 위한 API로, 객체 지향 프로그래밍과 관계형 데이터베이스 간의 브릿지 역할을 합니다. @Entity 어노테이션은 JPA의 핵심적인 부분으로, 이 어노테이션을 사용하여 자바 클래스를 데이터베이스 테이블과 매핑할 수 있습니다.

 

@Table 란?

@Table 어노테이션은 JPA(Java Persistence API)에서 엔티티 클래스와 데이터베이스 테이블 간의 매핑을 위해 사용되는 어노테이션입니다. @Table 어노테이션을 사용하여 엔티티 클래스를 특정 데이터베이스 테이블에 매핑할 수 있습니다.

@Entity 어노테이션을 사용하여 엔티티 클래스를 정의하면, 클래스 이름을 기반으로 해당 엔티티가 매핑될 데이터베이스 테이블의 이름이 자동으로 생성됩니다. 하지만 경우에 따라 엔티티 클래스 이름과 데이터베이스 테이블 이름이 다르거나, 특정 속성을 추가하고자 할 때 @Table 어노테이션을 사용합니다.

 

@Id 어노테이션은 해당 필드가 엔티티의 기본 키(primary key)임을 나타냅니다. 데이터베이스 테이블의 각 행은 고유한 기본 키 값을 가져야 합니다. 이 어노테이션을 사용하여 JPA에게 어떤 필드가 엔티티의 기본 키로 사용되어야 하는지 알려줍니다.

 

@GeneratedValue: 이 어노테이션은 기본 키 값을 자동으로 생성하는 방법을 지정합니다. strategy 속성을 사용하여 생성 전략을 선택할 수 있습니다. GenerationType.IDENTITY는 데이터베이스의 자동 증가(auto-increment) 기능을 사용하여 기본 키 값을 생성한다는 의미입니다. 즉, 데이터베이스가 자동으로 유니크한 값을 생성해줍니다.

 

@NotNull: 이 어노테이션은 해당 필드가 null 값을 가질 수 없음을 나타냅니다. 즉, 해당 필드는 반드시 값이 존재해야 합니다. 이 어노테이션을 사용하여 데이터베이스 레벨에서 해당 필드의 제약 조건을 설정할 수 있습니다.

위의 코드에서 id 필드는 기본 키로 사용되며, 데이터베이스에서 자동으로 생성되는 값입니다. todo 필드는 null 값을 가질 수 없으며, 해당 필드가 필수값임을 나타냅니다.

 

-Spring JPA 설정 (application.yml)

  jpa:
    hibernate:
      ddl-auto: update //자동으로 엔티티 테이블 업데이트
    properties:
      hibernate:
        show_sql: true
        format_sql: true

-인터페이스 생성 repository 

package com.example.todoapp.repository;
//입력, 삭제, 수정을 도와주는 인터페이스

import com.example.todoapp.domain.ToDo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ToDoRepository extends JpaRepository<ToDo, Long> {
    //<엔티티 클래스, 엔티티클래스가 받고있는 Id의 타입을 적어줌>
}

-controller에 RequiredArgsConstructor 추가

@RequiredArgsConstructor //생성자를 자동으로 생성, 클래스 내의 final로 선언된 필드들을 대상으로 생성자를 생성
public class TodoController {
    private final ToDoRepository toDoRepository;

-데이터베이스에 저장

ToDo toDo = new ToDo();
        toDo.setTodo(todo); //todo 속성에 값 추가
        toDoRepository.save(toDo); //db에 저장

 

 

3. MySQL Workbench 연결 테이블 확인

- 입력 값을 화면에 표시하기 위해 Model 사용

public String index(Model model){
		//db저장된 값 가져옴
        List<ToDo> todos = toDoRepository.findAll();
        //모델에 todos라는 이름으로 todos 값을 저장
        model.addAttribute("todos", todos);
        return "todos";
    }

 

기본화면 만들기

 

0. TodoappAplication.java

package com.example.todoapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TodoappApplication {

	public static void main(String[] args) {
		SpringApplication.run(TodoappApplication.class, args);
	}

}

 

 

1. TodoController 생성

GetMapping으로 연결

package com.example.todoapp.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TodoController {
    @GetMapping("/")
    public String index(){
        return "todos.html";
    }
}

 

2. Todd.html 작성

<html lang="ko"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

    <h1>ToDo App</h1>
    <form method="post" action="/addTodo">
        <input type="text" name="todo" />
        <input type="submit" value="Add Todo" />
    </form>

</html>

 

3. 실행화면

Spring Boot, Spring Data JPA, 템플릿 엔진(HTML), MySQL 사용

Doker를 이용해서 MySQL 설치

 

-1프로젝트 생성

- https://start.spring.io/ 에서 프로젝트 생성 (Gradle)

 Dependencies : Lombok, Spring Boot DevTools, Spring Web, Spring Data JPA, MySQL Driver, Thymeleaf

- DataSource 객체를 생성하기위한 URL속성 필요

 

2. MySQL설치

- Docker-Desktop 설치

mkdir ~/devel
mkdir ~/devel/docker
mkdir ~/devel/docker/database

폴더 생성 후 nano docker-compose.yml 파일 생성

version: "2"

services:
  vacation-db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "root1234"
      MYSQL_DATABASE: "examplesdb"
      MYSQL_USER: "urstory"
      MYSQL_PASSWORD: "u1234"
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./database/init/:/docker-entrypoint-initdb.d/
      - ./database/datadir/:/var/lib/mysql
    platform: linux/x86_64
    ports:
      - 3306:3306

-MySQL Workbench 설치 (MySQL Client)

 

3. url 속성 넣어주기 

참고 https://rayakeem.tistory.com/13

inteliJ > application.properties(.yml) 설정파일 안에 작성 

spring.datasource.url=jdbc:mysql://localhost:3306/데이터베이스이름
spring.datasource.username=사용자명
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

 

4. test : HelloController 작성

테스트를 위한 HelloController, Hello.html 작성

HelloController

package com.example.todoapp.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

//spring mvc
@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}

 

Hello.html (위치: resources/templates)

-thymeleaf 레이아웃 사용

<html lang="ko"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<div> hello !! </div>
</html>

 

+ Recent posts