- 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에 접속해본다. 아래와 같이 화면이 뜨면 정상이다.
덧셈 테스트를 해본다. 파란색 단추(/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가 추가되었는지 확인 후 테스트해본다.
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
'개발자 일지 > Spring' 카테고리의 다른 글
[강의 후기] 인프런 김영한님 자바 ORM 표준 JPA 프로그래밍 (0) | 2024.10.22 |
---|---|
필터와 인터셉터 차이, 개념, 예제 (0) | 2024.09.20 |
[스프링]@ResponseBody 역할, 쓰는이유, 대체 어노테이션(@RestController) 알아보기 (0) | 2024.09.10 |
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(7) (3) | 2022.07.03 |
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(6) (0) | 2022.06.18 |
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(5) (0) | 2022.06.14 |
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(4) (0) | 2022.06.04 |
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(3) (2) | 2022.05.31 |