• [개인학습]스프링부트 + Swagger + JPA + MySQL 설정 및 테스트

    2022. 10. 10.

    by. 웰시코더

    반응형

    - SpringBoot 2.7.4 + Swagger2 + JPA 하이버네이트 + MySQL8 설정으로 Swagger 테스트와 JPA 테스트를 진행한다.
    - 빌드툴은 Maven, IDE는 인텔리제이를 사용한다.
    - Lombok도 사용한다.
    - 코드는 깃허브에서 관리한다.(https://github.com/coderahn/swagger-demo)


    1.Intro


    1.Swagger?

    API들이 갖고 있는 스펙을 관리할 수 있는 프로젝트/문서 프레임워크이다. API별 관리 및 테스트를 각각 하면 번거롭고 관리도 어렵다. 컨트롤러에 명시된 어노테이션을 붙여서 Swagger-ui 화면을 통해 관리 가능하다.

    2.JPA(Java Persistence API)?

    JPA는 자바진영의 ORM 기술 표준 인터페이스 모음이다. ORM은 Object-Relational Mapping의 약자로 객체를 RDB와 매핑하여 영속화 해주는 기술이다. JPA를 구현한 것들은 Hibernate, EclipseLink, DataNucleus 등이 있다. 여기서는 Hibernate로 진행하였다.

    2.Swagger 설정 및 테스트


    1.Swagger 설정 및 테스트

    우선 pom.xml에 스웨거 관련 의존성 추가를 진행한다. 스웨거2를 사용하는데 3으로 의존성 추가하였다.

    [pom.xml]

    <!-- swagger -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>


    config패키지 하위에 SwaggerConfig.java를 만들어 설정정보를 다음과 같이 입력한다. apiInfo()는 부수적인 정보 입력이라 개인에 맞게 적으면 된다. apis(), paths()는 들어올 경로 관련된 부분인데 일단 any()로 처리하여 모든 경로 접근을 허용하였다.

    [config/SwaggerConfig.java]

    @Configuration
    public class SwaggerConfig {
    
        @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .select()
                    .apis(RequestHandlerSelectors.any())
                    .paths(PathSelectors.any())
                    .build().apiInfo(apiInfo());
        }
    
        //swagger-ui 접속화면의 ui구성(제목, 부제목, version 등)
        private ApiInfo apiInfo() {
            String desc = "api test world";
            return new ApiInfoBuilder()
                    .title("SWAGGER TEST")
                    .description(desc)
                    .version("1.0")
                    .build();
        }
    }


    컨트롤러를 만든다. @Api는 해당 API컨트롤러의 이름을 지정할 수 있다. @ApiOperation는 api에 대한 기본적인 정보를 나타낸다. @ApiParam은 요청값에 대한 정보를 설정할 수 있다.

    [controller/SwaggerTestController.java]

    @RestController
    @Api(value="Swagger Test Controller")
    @RequestMapping("/")
    public class SwaggerTestController {
        @Autowired
        MemberService memberService;
    
        @ApiOperation(value="덧셈", notes="덧셈 사칙연산 수행")
        @GetMapping(value= "/add")
        public ResponseEntity<Integer> add (
                @ApiParam(value="1번 값", required = true, example = "1")
                @RequestParam(value="num1", required = true) int num1,
                @ApiParam(value="2번 값", required = true, example = "2")
                @RequestParam(value="num2", required = true)int num2
        ) {
            int sum = num1 + num2;
    
            return ResponseEntity.ok(sum);
        }
    }


    @EnableSwagger2 어노테이션을 프로젝트 run 하는 application 클래스에 붙여준다.

    [SwaggerDemoApplication.java]

    @SpringBootApplication
    @EnableSwagger2
    public class SwaggerDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SwaggerDemoApplication.class, args);
        }
    }


    스웨거에 접속해본다. 아래와 같은 에러가 발생했다.


    application.properties에 한 줄 추가해준다.

    spring.mvc.pathmatch.matching-strategy=ant_path_matcher


    다시 돌리니 서버가 잘 빌드되었다. localhost:8080/swagger-ui에 접속해본다. 아래와 같이 화면이 뜨면 정상이다.

    /회원저장 api는 이따가 JPA 설정 후에..


    덧셈 테스트를 해본다. 파란색 단추(/add)를 누르고, 값을 입력 후(10,20) Execute를 누른다. 그러면 아래 Response쪽에 결과가 나온다. 아래와 같다.

    3.JPA 설정 및 테스트


    현재 회사에서 JPA를 쓰지는 않지만 이제 거의 필수적인 시대가 된 것 같아 Swagger테스트 하면서 틈새학습했다.

    우선 아래와 같이 MySQL, JPA 하이버네이트 관련 의존성을 추가한다.

    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <!-- JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>



    회원을 저장하는 기능을 간단하게 만든다. DB MEBER테이블은 아래와 같다.

    CREATE TABLE `member` (
      `no` int NOT NULL AUTO_INCREMENT,
      `id` varchar(20) NOT NULL DEFAULT '',
      `password` varchar(20) DEFAULT NULL,
      `name` varchar(20) NOT NULL DEFAULT '',
      PRIMARY KEY (`no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


    Member에 저장할 데이터를 담을 MemberVo를 만든다. JPA관련 설정 설명은 주석에 적어놨다.

    [vo/MemberVo.java]

    /**
     * 1)@Data : @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
     * 2)@AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 만듦
     * 3)@NoArgsConstructor(access = AccessLevel.PROTECTED) : 파라미터가 없는 기본 생성자를 생성
     * 4)@Entity(name="member") : DB의 멤버테이블과 매핑할 vo객체 선언
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @Entity(name="member")
    public class MemberVo {
    
        /**
         * 1)no를 기본키(PK)로 지정
         * 2)해당 필드를 auto_increment로 설정하였기 때문에 직접할당 방식이 아니라 자동생성을 위해
         * @GeneratedValue 사용.
         * 3)stragegy = GenerationType.INDENTITY는 생성방식을 DB에 위임
         */
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long no;
    
        private String id;
    
        private String password;
    
        private String name;
    }


    JpaRepository를 구현하여 리포지토리를 만든다. Swagger 테스트에 적용하진 않았지만 만들어본다.

    [repository/MemberRepository.java]

    /**
     * 1)JpaRespository 인터페이스에는 미리 데이터 검색 등의 구조가 준비되어있음
     * 2)제네릭스 첫번째 타입은 엔티티, 두번째 타입은 엔티티의 id를 넣어주면 됨
     */
    @Repository
    public interface MemberRepository extends JpaRepository<MemberVo, Long> {
    
        public List<MemberVo> findById(String id);
        public List<MemberVo> findByName(String name);
        public List<MemberVo> findByNameLike(String keyword);
    }

    위 코드에서 findBy~방식으로 where 검색 조건을 구현할 수 있다.

    Repository를 사용하는 서비스단을 구현한다.

    [service/MemberService.java]

    @Service
    public class MemberService {
        @Autowired
        private MemberRepository memberRepository;
    
        public List<MemberVo> findAll() {
            List<MemberVo> members = new ArrayList<>();
            memberRepository.findAll().forEach(e -> members.add(e));
            return members;
        }
    
        public Optional<MemberVo> findById(Long no) {
            Optional<MemberVo> member = memberRepository.findById(no);
            return member;
        }
    
        //Swagger 테스트에 사용할 회원저장기능
        public MemberVo save(MemberVo member) {
            return memberRepository.save(member);
        }
    }


    이제 SwaggerTestController에 회원저장 기능을 작성한다. Swagger 테스트를 위해 @ApiOperation, @ApiParam등의 어노테이션도 붙여준다.

    [controller/SwaggerTestController.java]

    @RestController
    @Api(value="Swagger Test Controller")
    @RequestMapping("/")
    public class SwaggerTestController {
        @Autowired
        MemberService memberService;
    
        @ApiOperation(value="덧셈", notes="덧셈 사칙연산 수행")
        @GetMapping(value= "/add")
        public ResponseEntity<Integer> add (
                @ApiParam(value="1번 값", required = true, example = "1")
                @RequestParam(value="num1", required = true) int num1,
                @ApiParam(value="2번 값", required = true, example = "2")
                @RequestParam(value="num2", required = true)int num2
        ) {
            int sum = num1 + num2;
    
            return ResponseEntity.ok(sum);
        }
    
        @ApiOperation(value="회원저장", notes="회원저장기능 수행")
        @PostMapping
        public ResponseEntity<MemberVo> save(@ApiParam(example = "memberVo") MemberVo member) {
            return new ResponseEntity<MemberVo>(memberService.save(member), HttpStatus.OK);
        }
    }


    마지막으로 application.properties에 db설정정보와 jpa설정 정보를 붙여준다.

    #SWAGGER 에러 설정
    spring.mvc.pathmatch.matching-strategy=ant_path_matcher
    
    #DB설정
    spring.datasource.url=jdbc:mysql://localhost:3306/swagger_test?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=1234
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    #JPA설정
    spring.jpa.database=mysql
    spring.jpa.show-sql=true
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect



    이제 스웨거 ui로 들어가서 회원저장 api가 추가되었는지 확인 후 테스트해본다.

    Execute!(no는 auto_increment라서 안 넣었음)

    결과가 나왔다. no는 auto_increment.


    spring.jpa.show-sql을 true로 줘서 다음처럼 콘솔 로그 확인이 가능하다.





    참고
    1.롬복관련 : https://zi-c.tistory.com/entry/JAVA-Lombok-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-Data

    2.SpringBoot와 MySQL연동하기 : https://memostack.tistory.com/156

    3.SpringBoot, JPA 연동1 : https://kitty-geno.tistory.com/77

    4.SpringBoo, JPA 연동2 : https://goddaehee.tistory.com/209

    5.스웨거 설정 : https://medium.com/@jinnyjinnyjinjin/java-spring-boot-swagger-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-4f83029bd57b

    반응형

    댓글