이전 팀플 프로젝트에서는 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로 통일해도되지 않을까? 싶은 생각도 들고.. 아직 내가 잘 모르니 이부분은 더 공부 및 의견들을 찾아보고 나중에 추가적으로 보충해야겠다)
'개인프로젝트 > I'm' 카테고리의 다른 글
Spring 회원가입 후 로그인/로그아웃 HttpSession 적용 (0) | 2024.12.27 |
---|---|
Spring JPA 회원가입 + 비밀번호 암호화 Spring security(+회원 UUID 고유코드 생성)(241229 서버 2차 조건 검증 기능 추가) (0) | 2024.12.24 |
Spring 회원가입 시 인증번호 일치 여부 확인 / redis 사용 (2) | 2024.12.21 |
Spring Google 이메일 연동 + 메일 보내기(회원가입) + @Async로 인한 사용자 경험 개선 (0) | 2024.12.21 |
I'm 프로젝트 시작 (0) | 2024.12.15 |