Skip to content
Snippets Groups Projects
Commit 922cd247 authored by Su Sandi  Ko's avatar Su Sandi Ko
Browse files

final fix

parent b50fa6f4
Branches
No related tags found
No related merge requests found
Showing
with 498 additions and 44 deletions
......@@ -28,6 +28,18 @@
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
......@@ -79,6 +91,12 @@
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
......@@ -91,6 +109,19 @@
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
......@@ -124,7 +155,13 @@
</dependency>
</dependencies>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.13.2</version>
</dependency>
</dependencies>
<build>
<plugins>
......@@ -158,6 +195,7 @@
</execution>
</executions>
</plugin>
</plugins>
</build>
......
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.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;
@SpringBootApplication
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.PathMatchingResourcePatternReso
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.Resource;
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping(value="/")
public String HelloWorld(){
return "Hello World";
}
@SpringBootApplication
// @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("mapper/UserMapper.xml");
sessionFactory.setMapperLocations(res);
return sessionFactory.getObject();
}
}
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping(value = "/test")
public UserDto test(){
UserDto dto = new UserDto();
dto.setAge(17);
dto.setName("Jane");
return dto; }
}
\ No newline at end of file
package com.example.demo.constant;
public enum Role {
USER, ADMIN
}
package com.example.demo.controller;
import com.example.demo.service.MemberService;
import com.google.gson.JsonParser;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.example.demo.entity.Member;
import com.example.demo.dto.MemberDto;
import com.example.demo.constant.Role;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
public class MemberController {
private final MemberService memberService;
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
private Member createMember() {
MemberDto memberDto = new MemberDto();
memberDto.setEmail("user" + System.currentTimeMillis() + "@email.com"); // Unique email
memberDto.setName("홍길동");
memberDto.setAddress("서울시 마포구 합정동");
memberDto.setPassword("1234");
return Member.createMember(memberDto);
}
@GetMapping("/membertest")
public ResponseEntity<Map<String, Object>> membertest() {
try {
Member member = createMember();
Member savedMember = memberService.saveMember(member);
return ResponseEntity.ok(Map.of("status", "success", "data", savedMember));
} catch (IllegalStateException e) {
return ResponseEntity.status(HttpStatus.CONFLICT)
.body(Map.of("status", "error", "message", "이미 가입된 회원입니다."));
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("status", "error", "message", "서버 오류가 발생했습니다."));
}
}
@PostMapping("/makeMember")
public ResponseEntity<Map<String, Object>> makeMember(@RequestBody MemberDto memberDto) {
try {
System.out.println("name: " + memberDto.getName());
System.out.println("email: " + memberDto.getEmail());
System.out.println("address: " + memberDto.getAddress());
System.out.println("password: " + memberDto.getPassword());
Member member = Member.createMember(memberDto);
Member savedMember = memberService.saveMember(member);
return ResponseEntity.ok(Map.of("status", "success", "message", "OK", "data", savedMember));
} catch (IllegalStateException e) {
return ResponseEntity.status(HttpStatus.CONFLICT)
.body(Map.of("status", "error", "message", "이미 가입된 회원입니다."));
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("status", "error", "message", "서버 오류가 발생했습니다."));
}
}
}
package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.UserDto;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
@RestController
public class TestController {
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test(@RequestParam("id") String id) {
JsonObject obj = new JsonObject();
obj.addProperty("item_nm", "수제 햄버거");
obj.addProperty("item_detail", "소고기 패티와 토마토가 들어 있는 햄버거");
obj.addProperty("item_reg_date", "2022/04/22");
obj.addProperty("item_price", "4000");
return obj.toString();
}
@RequestMapping(value = "/productlist", method = RequestMethod.GET) public String productList(){
JsonObject obj1 = new JsonObject(); obj1.addProperty("item_nm", "수제 햄버거"); obj1.addProperty("item_detail", "소고기 패티와 토마토가 들어 있는 햄버거");
obj1.addProperty("item_reg_date", "2022/04/22"); obj1.addProperty("item_price", "4000");
JsonObject obj2 = new JsonObject(); obj2.addProperty("item_nm", "카레라이스"); obj2.addProperty("item_detail", "매운 3 분 카레라이스"); obj2.addProperty("item_reg_date", "2022/03/10"); obj2.addProperty("item_price", "8000");
JsonObject obj3 = new JsonObject(); obj3.addProperty("item_nm", "라면"); obj3.addProperty("item_detail", "소고기 라면"); obj3.addProperty("item_reg_date", "2021/09/10"); obj3.addProperty("item_price", "1500");
JsonArray infoArray = new JsonArray();
infoArray.add(obj1);
infoArray.add(obj2);
infoArray.add(obj3);
return infoArray.toString();
}
}
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;
}
}
\ No newline at end of file
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;
}
\ No newline at end of file
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;
}
package com.example.demo.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor // Add no-args constructor for MyBatis
@AllArgsConstructor
public class UserDTO {
private int seq;
private String name;
private String country;
}
\ No newline at end of file
package com.example.demo.entity;
import com.example.demo.constant.ItemSellStatus;
import lombok.Getter;
import lombok.Setter;
......@@ -7,26 +8,26 @@ import java.time.LocalDateTime;
import javax.persistence.*;
import org.springframework.stereotype.Component;
@Table(name="item")
@Table(name = "item")
@Getter
@Setter
@ToString
@Entity
public class Item {
@Id
@Column(name="item_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false, length= 50)
private String itemNm;
@Column(name="price", nullable = false)
private int price;
@Column(nullable = false)
private int stockNumber;
@Lob
@Column(nullable = false)
private String itemDetail;
@Enumerated(EnumType.STRING)
@Column(name = "item_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false, length = 50)
private String itemNm;
@Column(name = "price", nullable = false)
private int price;
@Column(nullable = false)
private int stockNumber;
@Lob
@Column(nullable = false)
private String itemDetail;
@Enumerated(EnumType.STRING)
private ItemSellStatus itemSellStatus;
private LocalDateTime regTime;
private LocalDateTime updateTime;
......
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 createMember(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;
}
}
......@@ -7,7 +7,11 @@ import java.util.List;
import com.example.demo.entity.Item;
// @NoRepositoryBean
public interface ItemRepository extends JpaRepository<Item, Long>{
List<Item> findByItemNm(String itemNm);
List<Item> findByItemNmOrItemDetail(String itemNm, String itemDetail);
List<Item> findByPriceLessThan(Integer price);
@Query("select i from Item i where i.itemDetail like concat('%', :itemDetail, '%') order by i.price desc")
List<Item> findByItemDetail(@Param("itemDetail") String itemDetail);
}
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);
}
package com.example.demo.service;
import com.example.demo.entity.Member;
import com.example.demo.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
@Transactional
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public Member saveMember(Member member) {
if (!validateDuplicatetMember(member)) {
throw new IllegalStateException("이미 가입된 회원입니다.");
}
return memberRepository.save(member);
}
private boolean validateDuplicatetMember(Member member) {
Member findMember = memberRepository.findByEmail(member.getEmail());
return findMember == null;
}
}
\ No newline at end of file
......@@ -7,9 +7,12 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=web1
# spring.datasource.driver-class-name=org.h2.Driver
# spring.datasource.url=jdbc:h2:mem:test
#spring.datasource.url=jdbc:h2:mem:testdb
# spring.datasource.username=sa
# spring.datasource.password=
# spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.show_sql = true spring.jpa.properties.hibernate.connection.autocommit = true spring.jpa.properties.hibernate.format_sql = true logging.level.org.hibernate.type.descriptor.sql = trace
\ No newline at end of file
spring.jpa.properties.hibernate.show_sql = true
spring.jpa.properties.hibernate.connection.autocommit = true
spring.jpa.properties.hibernate.format_sql = true
logging.level.org.hibernate.type.descriptor.sql = trace
\ No newline at end of file
<?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>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>Test Webjars</title>
<link rel="stylesheet" href="/app/s202322014/code/proxy/3000/webjars/bootstrap/5.1.3/css/bootstrap.min.css">
<script src="/app/s202322014/code/proxy/3000/webjars/jquery/3.6.0/jquery.min.js"></script>
<script src="/app/s202322014/code/proxy/3000/webjars/popper.js/2.9.3/umd/popper.min.js"></script>
<script src="/app/s202322014/code/proxy/3000/webjars/bootstrap/5.1.3/js/bootstrap.min.js"></script>
</head>
</head>
<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>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Product</title>
<link rel="stylesheet" href="/app/s202322014/code/proxy/3000/webjars/bootstrap/5.1.3/css/bootstrap.min.css">
<script src="/app/s202322014/code/proxy/3000/webjars/jquery/3.6.0/jquery.min.js"></script>
<script src="/app/s202322014/code/proxy/3000/webjars/popper.js/2.9.3/umd/popper.min.js"></script>
<script src="/app/s202322014/code/proxy/3000/webjars/bootstrap/5.1.3/js/bootstrap.min.js"></script>
<script>
$(document).ready(function () {
$("button").click(function () {
$.ajax({
type: 'GET',
url: '/app/s202322014/code/proxy/3000/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>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Product</title>
<link rel="stylesheet" href="/app/s202322014/code/proxy/3000/webjars/bootstrap/5.1.3/css/bootstrap.min.css">
<script src="/app/s202322014/code/proxy/3000/webjars/jquery/3.6.0/jquery.min.js"></script>
<script src="/app/s202322014/code/proxy/3000/webjars/popper.js/2.9.3/umd/popper.min.js"></script>
<script src="/app/s202322014/code/proxy/3000/webjars/bootstrap/5.1.3/js/bootstrap.min.js"></script>
<script>
$(document).ready(function () {
$("button").click(function () {
$.ajax({
type: 'GET',
url: '/app/s202322014/code/proxy/3000/productlist',
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>
</tr>
<th>상품상세설명</th>
<th>상품등록일</th>
<th>상품가격</th>
</tr>
</thead>
<tbody id="tableBody">
</tbody>
</table>
</body>
</html>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment