From 922cd247bc97ea70880c1b36aef8ee9501a72afe Mon Sep 17 00:00:00 2001 From: Su Sandi Ko <s202322014@ajou.ac.kr> Date: Thu, 3 Apr 2025 03:49:45 +0900 Subject: [PATCH] final fix --- pom.xml | 40 ++++++++- .../com/example/demo/DemoApplication.java | 49 +++++++---- .../java/com/example/demo/TestController.java | 12 --- .../java/com/example/demo/constant/Role.java | 5 ++ .../demo/controller/MemberController.java | 68 +++++++++++++++ .../demo/controller/TestController.java | 38 +++++++++ .../demo/controller/UserController.java | 30 +++++++ .../java/com/example/demo/dao/UserDAO.java | 6 ++ .../java/com/example/demo/dto/MemberDto.java | 14 ++++ .../java/com/example/demo/dto/UserDTO.java | 16 ++++ .../java/com/example/demo/entity/Item.java | 29 +++---- .../java/com/example/demo/entity/Member.java | 38 +++++++++ .../demo/repository/ItemRepository.java | 6 +- .../demo/repository/MemberRepository.java | 8 ++ .../example/demo/service/MemberService.java | 27 ++++++ src/main/resources/application.properties | 7 +- src/main/resources/mapper/UserMapper.xml | 12 +++ src/main/resources/static/index.html | 42 ++++++++++ src/main/resources/static/product.html | 39 +++++++++ src/main/resources/static/productList.html | 56 +++++++++++++ .../demo/repository/ItemRepositoryTest.java | 82 +++++++++++++++++-- 21 files changed, 571 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/com/example/demo/TestController.java 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/TestController.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/mapper/UserMapper.xml create mode 100644 src/main/resources/static/index.html create mode 100644 src/main/resources/static/product.html create mode 100644 src/main/resources/static/productList.html diff --git a/pom.xml b/pom.xml index ee799c7..456d544 100644 --- a/pom.xml +++ b/pom.xml @@ -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> diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java index fbceb8e..71c3ca5 100644 --- a/src/main/java/com/example/demo/DemoApplication.java +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -1,21 +1,42 @@ 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(); +} } diff --git a/src/main/java/com/example/demo/TestController.java b/src/main/java/com/example/demo/TestController.java deleted file mode 100644 index fc0b76b..0000000 --- a/src/main/java/com/example/demo/TestController.java +++ /dev/null @@ -1,12 +0,0 @@ -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 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..833a0a9 --- /dev/null +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -0,0 +1,68 @@ +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", "서버 오류가 발생했습니다.")); + } + } +} diff --git a/src/main/java/com/example/demo/controller/TestController.java b/src/main/java/com/example/demo/controller/TestController.java new file mode 100644 index 0000000..52f0d5d --- /dev/null +++ b/src/main/java/com/example/demo/controller/TestController.java @@ -0,0 +1,38 @@ +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(); + + + } +} 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..7b8a5c3 --- /dev/null +++ b/src/main/java/com/example/demo/controller/UserController.java @@ -0,0 +1,30 @@ +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 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..b091220 --- /dev/null +++ b/src/main/java/com/example/demo/dao/UserDAO.java @@ -0,0 +1,6 @@ +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 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..313190f --- /dev/null +++ b/src/main/java/com/example/demo/dto/MemberDto.java @@ -0,0 +1,14 @@ +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..5b8b4f9 --- /dev/null +++ b/src/main/java/com/example/demo/dto/UserDTO.java @@ -0,0 +1,16 @@ +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 diff --git a/src/main/java/com/example/demo/entity/Item.java b/src/main/java/com/example/demo/entity/Item.java index 5c433f0..13bc38c 100644 --- a/src/main/java/com/example/demo/entity/Item.java +++ b/src/main/java/com/example/demo/entity/Item.java @@ -1,4 +1,5 @@ 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; 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..7492a0e --- /dev/null +++ b/src/main/java/com/example/demo/entity/Member.java @@ -0,0 +1,38 @@ +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; + } + +} diff --git a/src/main/java/com/example/demo/repository/ItemRepository.java b/src/main/java/com/example/demo/repository/ItemRepository.java index c0d9053..41b0f63 100644 --- a/src/main/java/com/example/demo/repository/ItemRepository.java +++ b/src/main/java/com/example/demo/repository/ItemRepository.java @@ -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); } 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..8f25245 --- /dev/null +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -0,0 +1,27 @@ +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 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9f08d1d..0d6bd92 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -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 diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..34c66f2 --- /dev/null +++ b/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,12 @@ +<?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 diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..483e0cc --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,42 @@ +<!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 diff --git a/src/main/resources/static/product.html b/src/main/resources/static/product.html new file mode 100644 index 0000000..9a062d5 --- /dev/null +++ b/src/main/resources/static/product.html @@ -0,0 +1,39 @@ +<!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 diff --git a/src/main/resources/static/productList.html b/src/main/resources/static/productList.html new file mode 100644 index 0000000..4b08281 --- /dev/null +++ b/src/main/resources/static/productList.html @@ -0,0 +1,56 @@ +<!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 diff --git a/src/test/java/com/example/demo/repository/ItemRepositoryTest.java b/src/test/java/com/example/demo/repository/ItemRepositoryTest.java index bb4cd02..32b18c1 100644 --- a/src/test/java/com/example/demo/repository/ItemRepositoryTest.java +++ b/src/test/java/com/example/demo/repository/ItemRepositoryTest.java @@ -6,24 +6,88 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; import com.example.demo.entity.Item; import com.example.demo.entity.QItem; + +//import com.example.demo.entity.QItem; import org.junit.jupiter.api.DisplayName; import java.time.LocalDateTime; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.junit.runner.RunWith; -import com.example.demo.constant.ItemSellStatus; import java.util.List; -import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQuery; +import com.example.demo.constant.ItemSellStatus; +import java.util.List; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.querydsl.jpa.impl.JPAQuery; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import javax.swing.text.html.parser.Entity; + @SpringBootTest -@TestPropertySource(locations="classpath:application-test.properties") -@RunWith( SpringJUnit4ClassRunner.class ) +@TestPropertySource(locations = "classpath:application-test.properties") +@RunWith(SpringJUnit4ClassRunner.class) public class ItemRepositoryTest { @Autowired ItemRepository itemRepository; -@Test -@DisplayName("상품 저장 테스트") public void createItemTest(){ -Item item = new Item(); item.setItemNm("테스트 상품"); item.setPrice(100000); item.setItemDetail("테스트 상품 상세 설명"); item.setStockNumber(100); item.setRegTime(LocalDateTime.now()); item.setUpdateTime(LocalDateTime.now()); - Item savedItem = itemRepository.save(item); -System.out.println(savedItem.toString()); + + @PersistenceContext + EntityManager em; + + public void createItemList() { + for (int i = 1; i <= 10; i++) { + } + } + + @Test + @DisplayName("상품명 조회 테스트") + public void findByItemNmTest() { + this.createItemList(); + List<Item> itemList = itemRepository.findByItemNm("테스트 상품 1"); + for (Item item : itemList) { + System.out.println(item.toString()); + } + } + + @Test + @DisplayName("상품명, 상품상세 설명 OR 테스트") + public void findByItemNmOrItemDetailTest() { + this.createItemList(); + List<Item> itemList = itemRepository.findByItemNmOrItemDetail("테스트 상품 1", "테스트 상품 상세 설명 5"); + for (Item item : itemList) { + System.out.println(item.toString()); + } + } + + @Test + @DisplayName("가격 LessThan 테스트") + public void findByPriceLessThanTest() { + this.createItemList(); + List<Item> itemList = itemRepository.findByPriceLessThan(10005); + for (Item item : itemList) { + System.out.println(item.toString()); + } + } + + @Test + @DisplayName("@Query를 이용한 상품 조회 테스트") + public void findByItemDetailTest() { + this.createItemList(); + List<Item> itemList = itemRepository.findByItemDetail("테스트 상품 상세 설명"); + for (Item item : itemList) { + System.out.println(item.toString()); + } + } + + @Test + @DisplayName("Querydsl 조회테스트 1") + public void queryDslTest() { + this.createItemList(); + JPAQueryFactory queryFactory = new JPAQueryFactory(em); + QItem qItem = QItem.item; + JPAQuery<Item> query = queryFactory.selectFrom(qItem) + .where(qItem.itemSellStatus.eq(ItemSellStatus.SELL)) + .where(qItem.itemDetail.like("%" + "테스트 상품 상세설명" + "%")) + .orderBy(qItem.price.desc()); + List<Item> itemList = query.fetch(); + for (Item item : itemList) { + System.out.println(item.toString()); + } } } \ No newline at end of file -- GitLab