본문 바로가기
개발자 일지/Spring

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

by 네빌링 2022. 10. 10.
반응형

- 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

반응형