이전 팀플 프로젝트에서는 mybatis를 사용했음

 

mybatis를 사용하면서 jpa라는 방법이 있다는것을 알게되어

이번 개인프로젝트에서는 jpa를 사용해보았음

우선 각각의 방법을 비교해보았을 때
내가 느낀 방법으로는..

 

---mybatis

sql 쿼리를 직접 작성함(특정 데이터를 세밀하게 제어가능)
복잡한 쿼리에 유용함

간단한 데이터라도 필요하다면 쿼리를 작성해줘야함(살짝불편)

쿼리작성중 실수도 생길수있고, 유지보수도 좀 까다로움

 

---jpa

sql 쿼리 작성 안함(쿼리 자동화/간편함)
객체 지향적으로 테이블을 다룰수있음
간단한 CRUD 작업엔 매우 간편한데, 복잡한 조인 합계등이 필요한 쿼리에는 mybatis가 더 유용할수있음

 

 

select > find
delete > delete

update > save

update > save

이렇게 메소드만 추가하면 알아서 원하는 데이터를 가져올수있고
지우고 수정 및 저장도 가능
근데 복잡한 쿼리에는 mybatis가 더 유용함(예를들면 팀프로젝트떄 매출통계를 맡은적이 있는데 이럴때 mybatis가 더 유용할것으로 판단됨)

 

 

---jpa 사용예시

 

>jsp

<!-- 아이디 -->

<label for="username">아이디</label>

<div class="input-wrapper">

<input type="text" id="username" name="username" placeholder="아이디" required pattern="^[a-zA-Z0-9]+$" title="아이디는 영어 대소문자와 숫자만 가능합니다.">

<button type="button" id="checkUsername">확인</button>

</div>

 

회원가입 폼이다

input(text/(아이디 적는칸)에 계정 생성시에 원하는 id를 입력한 후
확인 버튼을 누를시

>js

$.ajax({

url : '/signUp/checkId',

method : 'GET',

data : {

userId

},

success : function(data){

 

},

error: function(xhr, status, error) {

console.error('에러 발생:', error); // 에러 처리

}

});

비동기 방식으로 중복검사를 하기위해 ajax사용
jsp input에 입력된 userId를 데이터로 보냄

 

>controller(java)

@RestController

@RequiredArgsConstructor

public class ImLoginRestController {

 

private final ImSignUpCheckService imSignUpCheckService;

 

 

@GetMapping("/signUp/checkId")

public boolean checkId(@RequestParam String userId) {

 

 

System.out.println(imSignUpCheckService.checkId(userId));

 

return false;

}

 

}

 

(return false는 잠시 에러나는 것을 방지하기 위해 해둔거에요)

userId를 받고 imSignUpCheckServic에 checkId메소드로 보냄

(작업해야할 코드나 로직등 service로 보내서 service클래스에서 작업하기)

 

>service(java)

@Service

@RequiredArgsConstructor

public class ImSignUpCheckService {

 

private final ImUserRepository imUserRepository;

 

public boolean checkId(String userId) {

 

return imUserRepository.existsByUserId(userId);

}

 

}

 

userId중복체크 간단한 코드니 바로 return 값으로 넣어주고

public interface ImUserRepository extends JpaRepository<ImUser, String>{

 

boolean existsByUserId(String userId);

 

}

 

ImUser에 String userId 존재하는지 확인(existsBy) 그래서 boolean값으로 받음

여기서 mybatis처럼 

select - find

delete - delete

update, insert - save

등 메소드를 활용하여 간단한 데이터를 뽑고 저장하고 수정할 수 있음

join에 join에 복잡한 쿼리가 필요할시엔 mybatis가 유용함

 

@Entity

@Table(name = "im_user")

@Getter

@Setter

public class ImUser {

 

// 유저 고유 코드번호

@Id

@Column(name = "user_code", length = 50)

private String userCode;

 

// 유저 아이디

@Column(name = "user_id", length = 50)

private String userId;

 

// 유저 비밀번호

@Column(name = "user_password", length = 255)

private String userPassword;

 

// 유저 닉네임

@Column(name = "user_nickname", length = 50)

private String userNickname;

 

// 유저 등록된 이메일

@Column(name = "user_email", length = 100)

private String userEmail;

 

// 유저 정보(ex 유저, 관리자)

@Column(name = "user_role", length = 20)

private String userRole;

 

// 유저 상태(활성화, 비매너 등등 추후 업데이트 예정)

@Column(name = "user_status", length = 20)

private String userStatus;

 

// 유저 아이디 생성날짜

@Column(name = "user_created_at")

private LocalDateTime userCreatedAt;

}

 

여기는 entity 에너테이션을 사용함
해당 클래스가 데이터베이스 테이블이랑 매핑이되어 데이터베이스 객체를 다룰수 있게된다

 

@Table(name = "im_user")

어떤 table명이랑 연결이되는지 적어준 것 

 

 

@Id 

@Column(name = "user_code", length = 50)

private String userCode;

 

얘네는 칼럼이랑 매핑하기 위한 애너테이션인데

@Id
>해당 필드가 기본 키임을 뜻함(primary key)

@Column
>얘는 name="user_code"라고 쓰여잇는데 이게 테이블의 칼럼명이고 그 칼럼의 데이터가 String userCode로 연결됨

>length는 예를들면 db테이블에 user_code 라는 칼럼의 최대 길이가 50임을 뜻하는거임 즉 db에 칼럼에varchar(50)으로 설정된거랑 맞춤 

 

 

mybatis / jpa
각각의 장단점이 있지만,

방법을 굳이 고르자면

프로젝트 크기에 따라 사용하는 방법을 정하면 좋을 것 같다는 생각이 든다..

(솔직히 간단한 쿼리날릴정도면 그냥 mybatis로도 충분히 쉽게 쓰지 않나..싶은 생각에 그럼 그냥 mybatis로 통일해도되지 않을까? 싶은 생각도 들고.. 아직 내가 잘 모르니 이부분은 더 공부 및 의견들을 찾아보고 나중에 추가적으로 보충해야겠다)

 

 

 

+ Recent posts