spring - 데이터 조회, 추가 ,제거

컨트롤러

  • 파일명: MemberController.java
    -> 요청과 응답을 담당함.
    -> view 와 model 사이에서 로직을 담당함.
package com.example.controller;

import java.util.List;

import com.example.entity.Member;
import com.example.service.MemberDB;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
// 파일을 만들어서 관리하는게 편함
@RequestMapping(value = "/member")
public class MemberController {

    // BD에 일의 수행하는 클래스
    // 클래스명 obj = new 클래스명();
    @Autowired
    private MemberDB memberDB;

    // 삭제하기
    // 127.0.0.1:8080/member/delete?id=12
    // <form action="" method="get">
    // <input type="text" name="id" value="12">

    // <a href="/member/delete?id=12"></a>
    @GetMapping(value = {"/delete"})
    public String deleteGET(@RequestParam(name="id") String id){
        int ret = memberDB.deleteMember(id);

        if (ret == 1) {
            return "redirect:/member/selectlist";
        }

        return "redirect:/member/selectlist";
    }

    // 조회하기
    // 127.0.0.1:8080/member/selectlist
    @GetMapping(value = {"/selectlist"})
    public String selectlistGET(Model model){

        // 1. DB에서 목록 받아오기
        List<Member> list = memberDB.selectListMember();

        // 2. jsp로 전달하기(jsp에서의 변수명, 실제 전송값)
        model.addAttribute("list", list);

        // 3. member 폴더의 select.jsp를 표시하라
        return "member/select";
    }
    
    // 127.0.0.1:8080/member/insert
    @GetMapping(value = {"/insert"})
    public String insertGET(){
        // member_insert.jsp로 생성
        // member 폴더에 있는 insert.jsp 표시
        return "member/insert";
    }

    // post는 사용자가 입력한 내용이 전달되고 DB 작업을 위해서 필요한 시점
    // jsp를 표시하는게 아니라 주소창에 입력후 엔터키를 누름
    @PostMapping(value = {"/insert"})
    public String insertPOST(
            // 객체를 하나로 묶는 것.
            // jsp 와 entity 각 객체의 변수명을 일치시켜줘야함.
            @ModelAttribute Member mem ){

        System.out.println( mem.toString() );

        // 설계 부분을 사용
        memberDB.insertMember(mem);

        // 주소창에 /member/insert를 입력후
        // 엔터키를 누르는것과 같은 역할
        return "redirect:/member/insert";
    }

}
  • Annotation
    -> @Controller : 컨트롤러 설정을 해줌
    -> @PostMapping, @RequestMapping, @GetMapping : value값에 해당하는 클래스나 메소드를 가져와서 실행
    -> Autowired : 클래스를 변수엔 자동으로 담는다?

entity(Model)
-> 클라이언트가 요청할 데이터를 지정한다.

  • 파일명: Member.java
package com.example.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@NoArgsConstructor
@ToString

// DB 컬렉션 지정
@Document(collection = "member3")

// entity는 DB 에 들어갈 column 의 객체
public class Member {

    @Id
    private String id = null;

    private String pw = null;
    
    private String pw1 = null;

    private String name = null;

    private int age = 0;
}

추가하기

템플릿(jsp)

  • 파일명: insert.jsp
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<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">
    <title>회원가입</title>
    <!-- bootstrap/css -->
    <link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}" />
    <!-- bootstrap/js -->
    <script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script>
</head>
<body>
    
    
    <div>
        <h3>회원가입</h3>
        <!-- th는 thymeleaf -->
        <!-- thymeleaf: 템플릿 엔진, 컨트롤러가 전달하는 데이터를 이용하여 화면 구현 -->
        <form th:action="@{/member/insert}" method="post">
            아이디: <input type="text" name="id" /> <br />
            암호: <input type="password" name="pw" /> <br />
            암호2: <input type="password" name="pw1" /> <br />
            이름: <input type="text" name="name" /> <br />
            나이: <input type="text" name="age" /> <br />
            <input type="submit" class="btn btn-primary" value="회원가입" />
        </form>
        

    </div>
    
</body>
</html>

설계부 interface

  • 파일명: MemberDB.java
package com.example.service;

import com.example.entity.Member;

import org.springframework.stereotype.Service;

// DB 와 연동하는 부분
// 구현하는 설계 부분
@Service
public interface MemberDB {
    
    // 추가할 내용을 member로 주면 추가한 후에
    // 실제 추가된 내용을 반환
    public Member insertMember(Member member);

}

구현부

  • 파일명: MemberDBImpl.java
package com.example.service;

import com.example.entity.Member;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;

// DB 연동을 실제로 수행하는 구현부
// 구현부는 프레임워크에 따라서 안만듬..
@Service
public class MemberDBImpl implements MemberDB {

    // 환경설정으로 생성된 객체를 가져옴
    @Autowired
    private MongoTemplate mongodb;

    @Override
    public Member insertMember(Member member) {
        try {
            return mongodb.insert(member);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        
    }
    
}

조회하기, 삭제하기

  • 파일명: member/select.jsp
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<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">
    <title>회원목록</title>
    <!-- bootstrap/css -->
    <link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}" />
    <!-- bootstrap/js -->
    <script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script>
</head>
<body>
    
    
    <div>
        <h3>회워목록</h3>
        <hr />
        <table class="table">
            <tr>
                <th>아이디</th>
                <th>이름</th>
                <th>나이</th>
                <th>버튼</th>
            </tr>
            <!-- entity 의 변수를 사용 -->
            <tr th:each="tmp, idx : ${list}">
                <td th:text="${tmp.id}"></td>
                <td th:text="${tmp.name}"></td>
                <td th:text="${tmp.age}"></td>
                <td>
                    <a href="#">수정</a>
                    <a th:href="@{/member/delete(id=${tmp.id})}">삭제</a>

                    <!-- <form th:action="@{/member/delete}" method="get">
                        <input type="hidden" name="id" th:value="${tmp.id}" />
                        <input type="submit" value="삭제1">
                    </form> -->
                </td>
            </tr>
        </table>

    </div>
    
</body>
</html>

interface

  • 파일명: MemberDB.java
package com.example.service;

import java.util.List;

import com.example.entity.Member;

import org.springframework.stereotype.Service;

// DB 와 연동하는 부분
// 구현하는 설계 부분
@Service
public interface MemberDB {
    
    // 추가할 내용을 member로 주면 추가한 후에
    // 실제 추가된 내용을 반환
    public Member insertMember(Member member);

    // 회원 전체목록(page, search X)
    public List<Member> selectListMember();

    // 회원 1명 삭제(회원 아이디가 오면 삭제후 -1, 0 또는 1로 리턴)
    public int deleteMember(String id);

}

implements

  • 파일명: MemberDBImpl.java
package com.example.service;

import java.util.List;

import com.example.entity.Member;
import com.mongodb.client.result.DeleteResult;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

// DB 연동을 실제로 수행하는 구현부
// 구현부는 프레임워크에 따라서 안만듬..
@Service
public class MemberDBImpl implements MemberDB {

    // 환경설정으로 생성된 객체를 가져옴
    @Autowired
    private MongoTemplate mongodb;

    @Override
    public Member insertMember(Member member) {
        try {
            return mongodb.insert(member);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        
    }

    @Override
    public List<Member> selectListMember() {
        try {
            Query query = new Query();
            return mongodb.find(query, Member.class);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public int deleteMember(String id) {
        try {
            Member member = new Member();
            member.setId(id);
            
            DeleteResult result = mongodb.remove(member);
            if (result.getDeletedCount() == 1L) {
                return 1;
            }
            return 0;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
    
}

좋은 웹페이지 즐겨찾기