개발로드

★KDT 2024-04-15☆SpringBoot-쇼핑몰(1) 본문

JAVA

★KDT 2024-04-15☆SpringBoot-쇼핑몰(1)

위대한개발자 2024. 4. 15. 09:15

프로젝트 생성


 

Maven으로 기본 프로젝트 생성

 

<dependencies>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <optional>true</optional>
    </dependency>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
    </dependency>
</dependencies>

 

의존성에 Lombok, thymeleaf, Spring-boot-web 추가

 

spring.application.name=kwj
server.port=8090

 

서버포트는 8090으로 설정

 

HelloWorld 출력하기


 

HelloWorldController.java

@RestController
public class HelloWorldController {
        @GetMapping(value = "/")
        public String HelloWorld(){
            return "HelloWorld";
        }//end of method

}//end of class

 

@RestController 어노테이션은 Spring Framework에서 사용되는 특별한 종류의 컨트롤러를 정의합니다. 이 어노테이션이 적용된 클래스는 RESTful 웹 서비스의 엔드포인트를 제공하는 역할을 합니다.

여기서 "RESTful"은 Representational State Transfer의 약자로, 클라이언트와 서버 간의 통신을 위한 아키텍처 스타일입니다. RESTful 웹 서비스는 자원을 URI로 식별하고, HTTP 메서드를 사용하여 해당 자원에 대한 작업을 수행합니다.

@RestController 어노테이션이 적용된 클래스는 다음과 같은 특징을 가집니다:

HTTP 요청에 대한 응답으로 JSON, XML 또는 기타 형식의 데이터를 생성합니다.
@ResponseBody 어노테이션을 각 핸들러 메소드에 적용하는 것과 같은 효과를 제공합니다. 이것은 메소드가 반환하는 데이터가 HTTP 응답의 본문으로 직접 사용되어야 함을 나타냅니다.
Spring MVC 컨트롤러의 @Controller 어노테이션과 달리, @ResponseBody 어노테이션이 필요하지 않습니다. 모든 핸들러 메소드의 반환 값이 자동으로 HTTP 응답 본문으로 시리얼라이즈됩니다.
주로 API 엔드포인트를 제공하는데 사용됩니다.
간단히 말해서, @RestController 어노테이션이 적용된 클래스는 JSON 또는 XML 형식의 데이터를 반환하는 RESTful 웹 서비스의 핵심을 담당하는 클래스입니다.

 

 

Lombok


 

어노테이션 설명
@Getter/Setter 코드를 컴파일할 때 속성들에 대한 Getter/Setter 메소드 생성
@ToString toString() 메소드 생성
@AlLArgsConstructor 모든 속성에 대한 생성자 생성
@Value 불변(immutable)클래스 생성
@Log log 변수 자동 생

 

UserDto.java 생성

package com.kwj.dto;

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

@Getter
@Setter
@ToString
public class UserDto {

    private String name;
    private Integer age;

}//end of class

 

UserDto의 필드들은 private 속성으로 캡슐화가 되어있기 때문에 외부에서 호출을 하거나 값을 변경 하려면

getter/setter 메소드가 필요합니다. 이를 Lombok 라이브러리의 @Getter/setter 어노테이션을 통해서 메소드들을 자동으로 생성하였습니다.

 

TestController.java 생성

package com.kwj.controller;

import com.kwj.dto.UserDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping(value = "/test")
    public UserDto user() {
        UserDto user = new UserDto();
        user.setName("김원중");
        user.setAge(28);
        return user;
    }//end of method

}//end of class

 

실행화면

 

UserDto 객체를 리턴했기 때문에 JSON형식으로 브라우저에 출력이 되는걸 확인할 수 있습니다.

 

shop 데이터베이스 생성


 

의존성 추가


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

 

Jpa, h2, mysql 사용을 위해 의존성 추가

 

h2란?

H2 Database는 자바 기반의 관계형 데이터베이스로 매우 가볍고 빠른 데이터 베이스입니다.

디스크 기반의 데이터 저장뿐만 아니라 메모리 내에 데이터를 저장하는 인메로리 데이터베이스 기능을 지원합니다.

데이터를 영구적으로 저장하는 데 권장되는 데이터베이스는 아니지만 위의 장점들 때문에 테스트용 데이터 베이스로 많이 사용합니다.

 

application.properties 설정


spring.application.name=kwj

#어플리케이션 포트 설정
server.port= 8090

#MySQL 연결 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/shop?serverTimezone=Asia/Seoul
spring.datasource.username=/*mysql아이디*/
spring.datasource.password=/*mysql비밀번호*/

#실행되는 쿼리 콘솔  출력
spring.jpa.properties.hibernate.show_sql=true

#콘솔창에 출력되는 쿼리를 가독성이 좋게 포맷팅
spring.jpa.properties.hibernate.format_sql=true

#쿼리에 물음표로 출력되는 바인드 파라미터 출력
logging.level.org.hibernate.type.descriptor.sql=true

#어플리케이션 구동시 기존 테이블 삭제하고 새로생성
spring.jpa.hibernate.ddl-auto=create
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

 

ItemSellStatus.java 생성


package com.kwj.constant;

public enum ItemSellStatus {

    SELL, SOLD_OUT


}//end of enum

 

상품이 현재 판매중인지 픔잘 싱태인지를 나타내기 위한 enum타입의 클래스 생성

 

Item.java Entity 생성


package com.kwj.entity;

import com.kwj.constant.ItemSellStatus;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;

@Entity
@Table(name = "item")
@Getter
@Setter
@ToString
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)
    private ItemSellStatus itemSellStatus;  //상품 판매 상태
    
    private LocalDateTime regTime;  //등록시간

    private LocalDateTime updateTime;   //수정 시간

}//end of class

 

생성되는 table 로그

 

 

ItemRepository 생성


package com.kwj.repository;

import com.kwj.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ItemRepository extends JpaRepository<Item, Long> {

    

}//end of interface

 

Jpa를 이용하기 위해 JpaRepository 인터페이스를 상속받습니다. JpaRepository 인터페이스는 제네릭 타입으로

첫 번째에는 연결할 Entity 클래스의 이름, 두 번째에는 그 클래스의 primary key의 타입을 넣어줍니다.

 

 

application-test.properties 생성


#Datasource 설정
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=

#H2 데이터베이스 방언 설정
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

 

 

ItemRepositoryTest.java 생성


package com.kwj.repository;

import com.kwj.constant.ItemSellStatus;
import com.kwj.entity.Item;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

import java.time.LocalDateTime;

@SpringBootTest
//통합 테스트를 위해 스프링 부트에서 제공하는 어노테이션
//실제 어플리케이션을 구동할 때처럼 모든 Bean 을 Ioc 컨테이너에 등록
@TestPropertySource(locations = "classpath:application-test.properties")
//테스트 코드 실행시 application.properties 에 설정해둔 값보다 application-test.properties 에 같은
// 설정이있다면 더 높은 우선순위를 부여. 기존 설정은 MySQL 을 사용하지만 테스트에서는 h2 사용
    
class ItemRepositoryTest {

    @Autowired//Bean 을 주입
    ItemRepository itemRepository;
    
    @Test//테스트 메소드로 지정
    @DisplayName("상품 저장 테스트")
    public void createItemTest(){

        Item item = new Item();
        item.setItemNm("테스트 상품");
        item.setPrice(10000);
        item.setItemDetail("테스트 상품 상세 설명");
        item.setItemSellStatus(ItemSellStatus.SELL);
        item.setStockNumber(100);
        item.setRegTime(LocalDateTime.now());
        item.setUpdateTime(LocalDateTime.now());
        Item savedItem = itemRepository.save(item);
        System.out.println(savedItem.toString());

    }//end of method
}//end of testClass

 

테스트 메소드 실행화면

 


여유가 되신다면 제 GitHub에 오셔서 좋은 코드들을 구경해주세요!

 

https://github.com/gimpo5975?tab=repositories

 

gimpo5975 - Overview

gimpo5975 has 6 repositories available. Follow their code on GitHub.

github.com