JPA 설정
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
package com.example.euserservice.jpa;
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "users")
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50, unique = true)
private String email;
@Column(nullable = false, length = 50)
private String name;
@Column(nullable = false, unique = true)
private String userId;
@Column(nullable = false, unique = true)
private String encryptPwd;
}
✅ 상세 설명
@Entity: JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
Entity 객체의 인스턴스 하나가 테이블의 하나의 레코드 값을 의미@Table: 엔티티와 매핑할 테이블 지정
클래스 이름과 테이블 이름이 다를 경우 JPA에게 테이블 이름을 알려주는 역할@Id: 엔티티의 필드를 테이블의 기본 키(PK, Primary key)에 매핑하는 역할@Column: 엔티티의 필드를 테이블의 칼럼에 매핑@GeneratedValue: 즉 주키의 값을 위한 자동 생성 전략을 명시하는데 사용
선택적 속성으로는 generator와 strategy가 있음
➡generator: SequenceGenerator나 TableGenerator 어노테이션에서 명시된 주키 생성자를 재사용할 때 사용
➡strategy: persistence provider가 엔티티의 주키를 사용할 때 사용해야 하는 주키생성 전략을 의미
(🔗 출처: [JPA] @Id, @Column, @GeneratedValue, @Entity, @Table)
package com.example.euserservice.jpa;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<UserEntity, Long> {
//내용없음
}
✅ 상세 설명
CrudRepository<UserEntity, Long>
- CRUD 기능을 제공하는 인터페이스
org.springframework.data.repository- 인터페이스 Repository를 확장
CrudRepository <x,y>에서 x는 Entity 클래스명, y는 PK의 타입 작성
(🔗 출처: CrudRepository 와 JPARepository의 차이)
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.8</version>
</dependency>
✅ 상세 설명
modelMapper란?
하나의 클래스가 가지고 있는 정보를 다른 클래스로 변환 시켜줄 수 있는 Mapper 역할
package com.example.euserservice.service;
import com.example.euserservice.dto.UserDto;
import com.example.euserservice.jpa.UserEntity;
import com.example.euserservice.jpa.UserRepository;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserRepository userRepository;
@Override
public UserDto createUser(UserDto userDto) {
userDto.setUserId(UUID.randomUUID().toString());
//클래스 변환
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
UserEntity userEntity = mapper.map(userDto, UserEntity.class); //변환 시작
userEntity.setEncryptPwd("encrypted_password"); //구현 전이므로 default text 저장
userRepository.save(userEntity);
return null;
}
}
✅ 상세 설명
mapper.getConfiguration().setMatchingStrategy()
특정 매칭 전략을 입력해 주지 않고도 다른 매칭 전략을 사용할 수 있게끔 추가적인 매칭 전략을 제공MatchingStrategies.STRICT
1. 가장 엄격한 전략 (cf. 반대:MatchingStrategies.LOOSE)
2. source와 destination의 타입과 필드명이 같을 때만 변환
3. 의도하지 않은 매핑이 일어나는 것을 방지할 때 사용