From f6549fe9442698692f6f6359568b820051689ce7 Mon Sep 17 00:00:00 2001
From: jhm991231 <jhm991231@ajou.ac.kr>
Date: Wed, 2 Apr 2025 19:14:48 +0900
Subject: [PATCH] final commit

---
 .../com/example/demo/DemoApplication.java     | 31 +++++++++-
 .../java/com/example/demo/constant/Role.java  |  5 ++
 .../demo/controller/MemberController.java     | 34 +++++++++++
 .../demo/controller/TestController.java       | 32 +++++++---
 .../demo/controller/UserController.java       | 31 ++++++++++
 .../java/com/example/demo/dao/UserDAO.java    |  8 +++
 .../java/com/example/demo/dto/MemberDto.java  | 13 ++++
 .../java/com/example/demo/dto/UserDTO.java    | 14 +++++
 .../java/com/example/demo/entity/Member.java  | 41 +++++++++++++
 .../demo/repository/MemberRepository.java     |  8 +++
 .../example/demo/service/MemberService.java   | 32 ++++++++++
 src/main/resources/mappers/UserMapper.xml     | 17 ++++++
 src/main/resources/static/index.html          | 42 ++++++++++---
 src/main/resources/static/product.html        | 42 +++++++++++++
 src/main/resources/static/product_list.html   | 59 +++++++++++++++++++
 15 files changed, 393 insertions(+), 16 deletions(-)
 create mode 100644 src/main/java/com/example/demo/constant/Role.java
 create mode 100644 src/main/java/com/example/demo/controller/MemberController.java
 create mode 100644 src/main/java/com/example/demo/controller/UserController.java
 create mode 100644 src/main/java/com/example/demo/dao/UserDAO.java
 create mode 100644 src/main/java/com/example/demo/dto/MemberDto.java
 create mode 100644 src/main/java/com/example/demo/dto/UserDTO.java
 create mode 100644 src/main/java/com/example/demo/entity/Member.java
 create mode 100644 src/main/java/com/example/demo/repository/MemberRepository.java
 create mode 100644 src/main/java/com/example/demo/service/MemberService.java
 create mode 100644 src/main/resources/mappers/UserMapper.xml
 create mode 100644 src/main/resources/static/product.html
 create mode 100644 src/main/resources/static/product_list.html

diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java
index 372f9ff..99c38f5 100644
--- a/src/main/java/com/example/demo/DemoApplication.java
+++ b/src/main/java/com/example/demo/DemoApplication.java
@@ -1,14 +1,43 @@
 package com.example.demo;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.ApplicationContext;
+import java.util.Arrays;
+import com.example.demo.entity.Item;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.springframework.context.annotation.Bean;
+import javax.sql.DataSource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.Resource;
 
 @RestController
 @SpringBootApplication
-public class DemoApplication {
+// @EntityScan(basePackageClasses = {Item.class})
+public class DemoApplication {// implements CommandLineRunner{
+
+	// @Autowired
+	// private ApplicationContext appContext;
 
 	public static void main(String[] args) {
 		SpringApplication.run(DemoApplication.class, args);
 	}
+
+	@Bean
+	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
+		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+		sessionFactory.setDataSource(dataSource);
+
+		Resource[] res = new PathMatchingResourcePatternResolver().getResources("mappers/UserMapper.xml");
+		sessionFactory.setMapperLocations(res);
+
+		return sessionFactory.getObject();
+	}
+
 }
diff --git a/src/main/java/com/example/demo/constant/Role.java b/src/main/java/com/example/demo/constant/Role.java
new file mode 100644
index 0000000..ae88988
--- /dev/null
+++ b/src/main/java/com/example/demo/constant/Role.java
@@ -0,0 +1,5 @@
+package com.example.demo.constant;
+
+public enum Role {
+    USER, ADMIN
+}
diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java
new file mode 100644
index 0000000..4045077
--- /dev/null
+++ b/src/main/java/com/example/demo/controller/MemberController.java
@@ -0,0 +1,34 @@
+package com.example.demo.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.example.demo.dto.MemberDto;
+import com.example.demo.entity.Member;
+import com.example.demo.service.MemberService;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+public class MemberController {
+    @Autowired
+    MemberService memberService;
+
+    public Member createMember() {
+        MemberDto memberDto = new MemberDto();
+        memberDto.setEmail("test@email.com");
+        memberDto.setName("홍길동");
+        memberDto.setAddress("서울시 마포구 합정동");
+        memberDto.setPassword("1234");
+
+        return Member.creatMember(memberDto);
+    }
+
+    @RequestMapping(value = "/membertest", method = RequestMethod.GET)
+    public void membertest() {
+        Member member = createMember();
+        Member savedMember = memberService.saveMember(member);
+
+        System.out.println(member);
+        System.out.println(savedMember);
+    }
+
+}
diff --git a/src/main/java/com/example/demo/controller/TestController.java b/src/main/java/com/example/demo/controller/TestController.java
index d8186a6..082ef46 100644
--- a/src/main/java/com/example/demo/controller/TestController.java
+++ b/src/main/java/com/example/demo/controller/TestController.java
@@ -3,6 +3,7 @@ package com.example.demo.controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -11,17 +12,32 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 @RestController
 public class TestController {
-    @RequestMapping(value = "/test", method = RequestMethod.GET)
+    @RequestMapping(value = "/productlist", method = RequestMethod.GET)
     public String test(@RequestParam("id") String id) {
 
-        JsonObject obj = new JsonObject();
-        obj.addProperty("title", "신사와 아가씨");
-        obj.addProperty("content", "로맨틱 코미디");
+        JsonObject obj1 = new JsonObject();
+        obj1.addProperty("item_nm", "수제 햄버거");
+        obj1.addProperty("item_detail", "소고기 패티와 토마토가 들어 있는 햄버거");
+        obj1.addProperty("item_reg_date", "2025/04/02");
+        obj1.addProperty("item_price", "4000");
 
-        JsonObject data = new JsonObject();
-        data.addProperty("time", "토일 8시");
-        obj.add("data", data);
+        JsonObject obj2 = new JsonObject();
+        obj2.addProperty("item_nm", "카레라이스");
+        obj2.addProperty("item_detail", "매운 3분 카레라이스");
+        obj2.addProperty("item_reg_date", "2025/04/03");
+        obj2.addProperty("item_price", "8000");
 
-        return obj.toString();
+        JsonObject obj3 = new JsonObject();
+        obj3.addProperty("item_nm", "라면");
+        obj3.addProperty("item_detail", "소고기 라면");
+        obj3.addProperty("item_reg_date", "2025/04/04");
+        obj3.addProperty("item_price", "1500");
+
+        JsonArray infoArray = new JsonArray();
+        infoArray.add(obj1);
+        infoArray.add(obj2);
+        infoArray.add(obj3);
+
+        return infoArray.toString();
     }
 }
diff --git a/src/main/java/com/example/demo/controller/UserController.java b/src/main/java/com/example/demo/controller/UserController.java
new file mode 100644
index 0000000..64f3e28
--- /dev/null
+++ b/src/main/java/com/example/demo/controller/UserController.java
@@ -0,0 +1,31 @@
+package com.example.demo.controller;
+
+import java.util.List;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.example.demo.dao.UserDAO;
+import com.example.demo.dto.UserDTO;
+
+@RestController
+@MapperScan(basePackages = "com.example.demo.dao") // 탐색할 패키시 설정
+public class UserController {
+    @Autowired
+    private UserDAO userDAO;// UserDAO bean을 자동으로 주입
+
+    @RequestMapping("/users")
+    public List<UserDTO> users(@RequestParam(value = "country", defaultValue = "") String country) throws Exception { // query
+                                                                                                                      // String으로
+                                                                                                                      // country를
+                                                                                                                      // 받도록
+                                                                                                                      // 설정
+        final UserDTO param = new UserDTO(0, null, country);
+        final List<UserDTO> userList = userDAO.selectUsers(param);
+        return userList;
+    }
+
+}
diff --git a/src/main/java/com/example/demo/dao/UserDAO.java b/src/main/java/com/example/demo/dao/UserDAO.java
new file mode 100644
index 0000000..d298f5b
--- /dev/null
+++ b/src/main/java/com/example/demo/dao/UserDAO.java
@@ -0,0 +1,8 @@
+package com.example.demo.dao;
+
+import java.util.List;
+import com.example.demo.dto.UserDTO;
+
+public interface UserDAO {
+    List<UserDTO> selectUsers(UserDTO param) throws Exception;
+}
diff --git a/src/main/java/com/example/demo/dto/MemberDto.java b/src/main/java/com/example/demo/dto/MemberDto.java
new file mode 100644
index 0000000..4366ea2
--- /dev/null
+++ b/src/main/java/com/example/demo/dto/MemberDto.java
@@ -0,0 +1,13 @@
+package com.example.demo.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class MemberDto {
+    private String name;
+    private String email;
+    private String password;
+    private String address;
+}
diff --git a/src/main/java/com/example/demo/dto/UserDTO.java b/src/main/java/com/example/demo/dto/UserDTO.java
new file mode 100644
index 0000000..4fc23cf
--- /dev/null
+++ b/src/main/java/com/example/demo/dto/UserDTO.java
@@ -0,0 +1,14 @@
+package com.example.demo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@AllArgsConstructor // 자동으로 모든 매개변수를 받는 생성자를 생성
+@Getter // Getter 생성
+@Setter // Setter 생성
+public class UserDTO {
+    private int seq;
+    private String name;
+    private String country;
+}
diff --git a/src/main/java/com/example/demo/entity/Member.java b/src/main/java/com/example/demo/entity/Member.java
new file mode 100644
index 0000000..9e3900f
--- /dev/null
+++ b/src/main/java/com/example/demo/entity/Member.java
@@ -0,0 +1,41 @@
+package com.example.demo.entity;
+
+import javax.persistence.*;
+
+import com.example.demo.dto.MemberDto;
+import com.example.demo.constant.Role;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Entity
+@Table(name = "member")
+@Getter
+@Setter
+@ToString
+public class Member {
+    @Id
+    @Column(name = "member_id")
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    private String name;
+
+    @Column(unique = true)
+    private String email;
+    private String password;
+    private String address;
+
+    @Enumerated(EnumType.STRING)
+    private Role role;
+
+    public static Member creatMember(MemberDto memberDto) {
+        Member member = new Member();
+        member.setName(memberDto.getName());
+        member.setEmail(memberDto.getEmail());
+        member.setAddress(memberDto.getAddress());
+        member.setPassword(memberDto.getPassword());
+        member.setRole(Role.USER);
+        return member;
+    }
+}
diff --git a/src/main/java/com/example/demo/repository/MemberRepository.java b/src/main/java/com/example/demo/repository/MemberRepository.java
new file mode 100644
index 0000000..18dfe8b
--- /dev/null
+++ b/src/main/java/com/example/demo/repository/MemberRepository.java
@@ -0,0 +1,8 @@
+package com.example.demo.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import com.example.demo.entity.*;
+
+public interface MemberRepository extends JpaRepository<Member, Long> {
+    Member findByEmail(String email);
+}
diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java
new file mode 100644
index 0000000..797a6e7
--- /dev/null
+++ b/src/main/java/com/example/demo/service/MemberService.java
@@ -0,0 +1,32 @@
+package com.example.demo.service;
+
+import javax.transaction.Transactional;
+
+import org.springframework.stereotype.Service;
+
+import com.example.demo.entity.Member;
+import com.example.demo.repository.MemberRepository;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class MemberService {
+    private final MemberRepository memberRepository;
+
+    public Member saveMember(Member member) {
+        validateDuplicateMember(member);
+
+        return memberRepository.save(member);
+    }
+
+    private boolean validateDuplicateMember(Member member) {
+        Member findMember = memberRepository.findByEmail(member.getEmail());
+        if (findMember != null) {
+            System.out.println("이미 가입된 회원입니다.");
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/src/main/resources/mappers/UserMapper.xml b/src/main/resources/mappers/UserMapper.xml
new file mode 100644
index 0000000..15fdf72
--- /dev/null
+++ b/src/main/resources/mappers/UserMapper.xml
@@ -0,0 +1,17 @@
+<?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.example.demo.dao.UserDAO"><!--namespace를 통해 UserDAO와 연결합니다. -->
+        
+  <select id="selectUsers" parameterType="com.example.demo.dto.UserDTO"
+resultType="com.example.demo.dto.UserDTO">
+    SELECT `seq`, `name`, `country`  FROM lab03
+    <if test='country != null and country != ""'>
+        WHERE country = #{country}
+    </if>
+  </select>
+
+</mapper>
+
+
diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html
index 782da65..4fb69ef 100644
--- a/src/main/resources/static/index.html
+++ b/src/main/resources/static/index.html
@@ -2,12 +2,40 @@
 <html>
     <head>
         <meta charset="utf-8">
-        <title>example 1-2</title>
+        <title>Insert title here</title>
+      
+        <link rel="stylesheet" href="/webjars/bootstrap/5.1.3/css/bootstrap.min.css">
+        <script src="/webjars/jquery/3.6.0/jquery.min.js"></script>
+        <script src="/webjars/popper.js/2.9.3/umd/popper.min.js"></script>
+        <script src="/webjars/bootstrap/5.1.3/js/bootstrap.min.js"></script>      
     </head>
-
-    <body>
-        <H2>example 1-2</H2>
-        <HR>
-            example 1-2
-    </body>
+<body>
+    <div class="container">
+        <table class="table table-hover">
+          <thead class="thead-dark">
+          <tr>
+            <th>codeId</th>
+            <th>code</th>
+            <th>codeNm</th>
+            <th>codeDc</th>
+          </tr>
+          </thead>
+          <tbody>
+          <tr>
+            <td>COM001</td>
+            <td>REG01</td>
+            <td>단일 게시판 이용 등록</td>
+            <td>단일 게시판 이용 등록</td>
+          </tr>
+          <tr>
+            <td>COM001</td>
+            <td>REG02</td>
+            <td>커뮤니티 등록</td>
+            <td>커뮤니티 등록</td>
+          </tr>
+          </tbody>
+        </table>
+      </div>   
+</body>
 </html>
+
diff --git a/src/main/resources/static/product.html b/src/main/resources/static/product.html
new file mode 100644
index 0000000..8a01d79
--- /dev/null
+++ b/src/main/resources/static/product.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Product</title>
+    <link rel="stylesheet" href="/webjars/bootstrap/5.1.3/css/bootstrap.min.css">
+    <script src="/webjars/jquery/3.6.0/jquery.min.js"></script>
+    <script src="/webjars/popper.js/2.9.3/umd/popper.min.js"></script>
+    <script src="/webjars/bootstrap/5.1.3/js/bootstrap.min.js"></script>
+    <script>
+        $(document).ready(function(){
+          $("button").click(function(){
+
+            $.ajax({
+
+              type: 'GET',
+              url: '/test?id=1',
+              success: function(data){
+                var obj=JSON.parse(data);
+                $('#item_nm span').text(obj.item_nm)
+                $('#item_detail span').text(obj.item_detail)
+                $('#item_reg_date span').text(obj.item_reg_date)
+                $('#item_price span').text(obj.item_price)
+              }
+
+            });
+
+
+          });
+        });
+    </script>
+
+</head>
+<body>
+    <h1>상품 데이터 출력 예제</h1>
+    <div id = "item_nm">상품명: <span></span></div>
+    <div id = "item_detail">상품 상세설명: <span></span></div>
+    <div id = "item_reg_date">상품 등록일: <span></span></div>
+    <div id = "item_price">상품가격: <span></span></div>
+    <button>조회</button>
+</body>
+</html>
diff --git a/src/main/resources/static/product_list.html b/src/main/resources/static/product_list.html
new file mode 100644
index 0000000..34ae97b
--- /dev/null
+++ b/src/main/resources/static/product_list.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Product</title>
+    <link rel="stylesheet" href="/webjars/bootstrap/5.1.3/css/bootstrap.min.css">
+    <script src="/webjars/jquery/3.6.0/jquery.min.js"></script>
+    <script src="/webjars/popper.js/2.9.3/umd/popper.min.js"></script>
+    <script src="/webjars/bootstrap/5.1.3/js/bootstrap.min.js"></script>
+    <script>
+        $(document).ready(function(){
+          $("button").click(function(){
+
+            $.ajax({
+
+              type: 'GET',
+              url: '/productlist/?id=111',
+              success: function(data){
+                var array = JSON.parse(data);
+                for(i=0; i < array.length; i++){
+                    var obj = array[i];
+                    html = '';
+                    html += '<tr>';
+                    html += '<td>' + obj.item_nm + '</td>'
+                    html += '<td>' + obj.item_detail + '</td>'
+                    html += '<td>' + obj.item_reg_date + '</td>'
+                    html += '<td>' + obj.item_price + '</td>'
+                    html += '</tr>';
+                    $("#tableBody").append(html);
+                }
+
+              }
+
+            });
+
+
+          });
+        });
+    </script>
+
+</head>
+<body>
+<h1>상품 데이터 목록 출력</h1>
+<button>조회</button>
+<table class="table table-hover">
+    <thead class="thead-dark">
+        <tr>
+            <th>상품이름</th>
+            <th>상품상세설명</th>
+            <th>상품등록일</th>
+            <th>상품가격</th>
+        </tr>
+    </thead>
+    <tbody id="tableBody">
+    </tbody>
+</table>
+</body>
+</html>
+
-- 
GitLab