Spring Boot 프로젝트 JAP (mariaDB) 적용

성난호랑이 시니철 ㅣ 2024. 3. 20. 19:24

Spring Boot 프로젝트 JAP (mariaDB) 적용

 

mybatis만 사용하다 요즘 회사 공고에 JAP가 많이있어서 한번 적용해보기로

 

나중에 기존 프로젝트를 JAP로 마이그레이션 해봐야 할거 같다.

 

생각보다 할게 많은거 같다. 우선은 기본적인것만하고 JAP는 나중에 정리

 

JAP -  Java Persistence API (JAVA ORM 에 대한 API) 요기서는 Hibernate 사용

ORM - Object-Relational Mapping 객체와 관계형데이터베이스 매핑, DB의 특정 테이블이 자바의 객체로 맵핑되어 SQL문을 일일이 작성하지 않고 객체로 구현할 수 있도록 하는 프레임워크입니다.

 

controller -> service -> repository 입니다 기존 mybatis에서 mapper 를 repository  합니다.

 

build.gradle

 implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
 runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

 

jpa 추가 DB는 mariaDB사용

 

application.properties

 

############################################
# DB mariadb
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://도메인:3306/데이터베이스
spring.datasource.username=유저
spring.datasource.password=비밀번호

#############################################
#JPA
# ddl 은 create 하면 entity에 내용 대로 DB생성 
# 추후 서버 이관시 좋음
# show-sql 로그에 sql 로그
# physical-strategy 기본은 카멜표기법으로 나오는데 추가하면 원하는데로 가능
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

#############################################

 

Controller

@Tag(name = "UserInfoController", description = "User Info Service")
@Controller
@ResponseBody
@RequestMapping("1.0/userInfo")
public class UserInfoController {

    // 기본형
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final UserInfoService userInfoService;
    public UserInfoController(UserInfoService userInfoService) {
        this.userInfoService = userInfoService;
    }

    @Operation(summary = "회원정보 조회", description = "100:성공 200:실패")
//    @ApiDocumentResponse
    @ResponseBody
    @GetMapping(value = "getUserInfo", produces = {MediaType.APPLICATION_JSON_VALUE})
    public GetUserInfoResEntity getUserInfo(@ParameterObject @ModelAttribute GetUserInfoReqEntity reqEntity)throws Exception {
        return userInfoService.getUserInfo(reqEntity);
    }

    @Operation(summary = "회원정보 가입", description = "100:성공, 200:실패")
//    @ApiDocumentResponse
    @ResponseBody
    @PostMapping(value = "save", produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResEntity save(@ParameterObject @ModelAttribute PostUserInfoReqEntity reqEntity)throws Exception {
        return userInfoService.save(reqEntity);
    }

    @Operation(summary = "회원정보 수정 ", description = "100:성공, 200:실패")
//    @ApiDocumentResponse
    @ResponseBody
    @PutMapping(value = "update", produces = { MediaType.APPLICATION_JSON_VALUE })
    public ResEntity updateMember(@ParameterObject @ModelAttribute PutUserInfoReqEntity reqEntity) {
        return userInfoService.update(reqEntity);
    }


}

 

가입 조회 업데이트 구성 되어있습니다.

저는 request, response 구성하였습니다.

 

service

@Service
public class UserInfoService {

    private final UserRepository userRepository;

    public UserInfoService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }


    public GetUserInfoResEntity getUserInfo(GetUserInfoReqEntity reqEntity) {

        GetUserInfoResEntity resEntity = new GetUserInfoResEntity();
        resEntity.setCode("100");
        resEntity.setMessage("정상 처리 되었습니다.");

        UserEntity userEntity = userRepository.findByUserId(reqEntity.getUserId());
        if(userEntity != null){
            resEntity.setUserSq(userEntity.getUserSq());
            resEntity.setUserId(userEntity.getUserId());
            resEntity.setUserName(userEntity.getUserName());
        }else{
            resEntity.setCode("200");
            resEntity.setMessage("중복 아이디가 있습니다..");
            return resEntity;
        }

        return resEntity;
    }


    public ResEntity save(PostUserInfoReqEntity reqEntity) {
        ResEntity resEntity = new ResEntity();
        resEntity.setCode("100");
        resEntity.setMessage("정상 처리 되었습니다.");

        Boolean isExist = userRepository.existsByUserId(reqEntity.getUserId());
        if (isExist) {
            resEntity.setCode("200");
            resEntity.setMessage("중복 아이디가 있습니다..");
            return resEntity;
        }

        UserEntity data = new UserEntity();
        data.setUserId(reqEntity.getUserId());
        data.setUserName(reqEntity.getUserName());
        data.setUserPassword(reqEntity.getPassword());
        userRepository.save(data);
        return resEntity;
    }

    public ResEntity update(PutUserInfoReqEntity reqEntity) {
        ResEntity resEntity = new ResEntity();
        resEntity.setCode("100");
        resEntity.setMessage("정상 처리 되었습니다.");

        Boolean isExist = userRepository.existsByUserSq(reqEntity.getUserSq());

        if (isExist) {
            UserEntity data = new UserEntity();
            data.setUserId(reqEntity.getUserId());
            data.setUserName(reqEntity.getUserName());
            data.setUserSq(reqEntity.getUserSq());
            userRepository.save(data);
        }else{
            resEntity.setCode("200");
            resEntity.setMessage("회원정보가 없습니다.");
        }
        return resEntity;
    }

}

 

repostory

 

public interface UserRepository extends JpaRepository<UserEntity, Integer> {
    
    UserEntity findByUserId(String userId);

    boolean existsByUserId(String userId);

    boolean existsByUserSq(int userSq);

}

 

existsBy findBy findDistinctBy findFirst3By countBy deleteBy도
By 뒤부터는 컬럼 파싱

 

다양한 방법이 있습니다. 

 

dto 마지막 컬럼과 매칭 되는 entity 입니다.

 

@Entity(name = "USER_INFO")
@Data
public class UserEntity {
    /* 테이블 */
    /* 쿼리에 들어갈 테이블 컬럼들 */
    /* IDENTITY : AUTO_INCREMENT*/
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "USER_SQ")
    private int userSq;

    @Column(name = "USER_ID")
    private String userId;

    @Column(name = "USER_NAME")
    private String userName;

    @Column(name = "USER_PASSWORD")
    private String userPassword;

}

 

@Colume  없어도 무방합니다 저는 기존 DB에 설정되어있는 컬럼을 사용할려고 @Colume를 추가하였습니다.

@Entity name = "USER_INFO"  테이블 이름 입니다.

 

이부분이 DB 테이블과 연결되는 entity 입니다. 

 

 

참고 github: https://github.com/heechul88/project_sample/tree/dev_jpa

 

추후 시큐리티 마무리하면 jap join 집계 등 공부하겠습니다.