스프링부트 mysql 연동 - seupeulingbuteu mysql yeondong

.시작하기 전에

쇼핑몰 개발을 위해 Spring Boot 프로젝트 빌드와 Mysql DB세팅까지 마무리 했다.
그래서 개발을 시작하려하니 DB연결부터 살짝 버겁다.

.Gradle Dependencies Configuration

일단 DB연결을 하려면 Mysql Driver를 사용해야한다.
나는 의존성관리를 Gradle로 세팅했다.
그래서 Gradle에 사용법에 대해 먼저 학습하기 위해 Dependencies를 설정을 하기전에 Configuration에 대해 가볍게 알아보았다.

api : 런타임과 컴파일
implementation : 런타임과 컴파일
compileOnly : 컴파일
runtimeOnly : 런타임

공식문서를 찾아보니 이외에 compileOnlyApi나 test가 붙은 옵션도 많이 있다.
굉장히 심플한데 implementation과 api에 대한 차이를 잘모르겠다.
구글번역기를 돌려보니 더 난잡하게 번역해줘서 사진을 보고 대충 이해했는데 다음과 같다.

스프링부트 mysql 연동 - seupeulingbuteu mysql yeondong

(https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin)

api는 결국 implementation 아래에 있다는 것이다.
또한 공식문서에서도 api보단 implementation의 사용을 권장한다.

.Gradle Mysql Driver

결국 Mysql Connector는 런타임중에만 사용되기때문에 runtimeOnly가 적합한 옵션이라는 것을 알았으니 이제 gradle을 수정하여 사용해보자

dependencies {
	runtimeOnly 'mysql:mysql-connector-java'
}

런타임시에 Mysql Connector를 사용하기 위해 runtimeOnly로 종속성을 설정해줬다.
Gradle을 사용해서 의존성 관리는 매우 쉽다.

.application.properties 설정

DB에 붙기위해 정보를 입력해야한다.
다음과 같이 application.properties에서 설정해주면 된다.

spring.datasource.url=jdbc:mysql://DB주소:3306/DB명

spring.datasource.username=유저이름

spring.datasource.password=비밀번호

spring.jpa.show-sql: true

spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver

이렇게 하면 연결을 위한 설정은 전부 마쳤다.
이제 테스트를 위해 약간의 코드를 작성해보자

.UserEntity

Controller, Service, Repository 어노테이션을 사용하는 구조로 DB연결 테스트겸 회원가입 API를 만들고자 한다.
일단 유저 모델인 UserEntity를 먼저 만들어보자

@Data
@Entity
@Builder
@Table(name="user")
public class UserEntity {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    private String email;
    private String password;
}

실제로 사용할 앱이기때문에 원래소스보다 짧게 표현했다.
어노테이션에서 가볍게 설명하자면

@Data : Getter/Setter를 생략시켜주는 Lombok라이브러리
@Entity : Entity임을 선언하여 요청과 응답에서 주고 받을 모델 선언
@Builder : Builder를 생략시켜주는 Lombok라이브러리
@Table : 접근할 DB Table명 선언
@Id : PK(기본키)임을 선언
@GeneratedValue(strategy= GenerationType.IDENTITY) : Mysql과 MariaDB에서 A.I를 사용할때 선언 (GenerationType.AUTO를 사용하면 Mysql과 MariaDB를 알아서 구분해줌)

(https://projectlombok.org/features/Data)

이런 어노테이션이다.
Lombok을 사용하지 않는다면 대략 20줄의 코드는 늘어나는것 같다.
코드다이어트가 가능하다는게 정말 굉장한것같다.

.UserRepository

다음은 DB와 직접 접근해서 쿼리를 처리하는 Repository를 생성 해야한다.
코드는 다음과 같다.

public interface UserRepository extends CrudRepository<UserEntity, Integer> {
}

되게 비어보여서 코드를 작성하다 만것처럼 보이지만 간단한 crud는 쿼리없이 가능하다.
물론 복잡한 조건이 들어가는 쿼리같은 경우에는 추가적으로 메소드를 만들어야하지만 지금은 사용하지 않을것이기때문에 다음에 해보도록하자

.UserService, UserController

공식문서에는 Controller에서 Repository로 직접 접근하는 모습을 보여준다.
Service는 공식문서에서는 찾아보기 힘들어 포기했다.
그래도 여러 개발자분들의 게시글을 보았는데 다음과 같이 이해했다.

Controller는 클라이언트에게 요청을 받아 가공하여 Service한테 DB와의 접근을 요청을 한다.
Service는 Contoller에게 받은 요청과 데이터를 DB에 쿼리로 접근한다.

개인적으로 클라이언트와 접근하는 로직과 DB와 접근하는 로직이 분리되어있어서 가독성에 매우 좋다고 생각한다.
위 설명을 코드로 표현해보자

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public UserEntity insert(UserEntity userEntity) {
        return userRepository.save(userEntity);
    }
}


@Controller
@RequestMapping(path = "/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/signup")
    public UserEntity signup(@RequestBody UserEntity req) {
        UserEntity userEntity = UserEntity.builder()
                                        .email(req.getEmail())
                                        .password(req.getPassword())
                                        .build();

        return userService.insert(userEntity);
    }
}

Service에게는 UserEntity객체를 Repository에게 insert(repository.save)를 요청하고, Controller는 Service에게 UserEntity객체를 빌드해 주었다.
어노테이션을 설명하자면 아래와 같다.

@Service : Service Bean을 선언
@Controller : Controller Bean을 선언
@RequestMapping : 클라이언트의 요청을 받을 주소 맵핑
@Autowired : 의존 객체의 Bean을 선언
@PostMapping : HTTP Method 주소 맵핑

과거 Spring Legacy에서는 일일히 Bean을 등록하여 사용하는 번거로움이 있었다고 한다.
하지만 Autowired 어노테이션을 사용하여 Bean선언을 생략할 수 있게 업데이트 된듯하다.
Bean선언을 겪어본적이 없어서 잘모르겠지만 Class 하나당 Bean선언 코드가 늘어날것을 생각하면 굉장히 좋아진것은 알겠다.

.API 테스트

현재 프론트 개발이 진행이 더딘상황이어서 바로 React 프로젝트에 붙힐수는 없을것같다.
그래서 Postman을 활용해보려고 한다.
(https://www.postman.com/)

스프링부트 mysql 연동 - seupeulingbuteu mysql yeondong

스프링부트 mysql 연동 - seupeulingbuteu mysql yeondong

@RequestMapping과 @PostMapping으로 선언한 대로 /users/signup으로 UserEntity에 넣을값을 body에 json으로 넣어주니 로직이 정상적으로 동작했다.