실제로는 mysql을 사용할 것이지만 우선 테스트와 테이블 구조를 짜기 전에 h2를 사용해서 테스트를 하려고 한다.
h2에 login으로 db를 만들고
그 이후에 다음과 같은 url로 접근이 가능해진다.
이제 project에서 설정을 하자
server:
port: 8080
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/login-api
driver-class-name: org.h2.Driver
username: sa
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create
show-sql: true
logging:
level:
root: debug
@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "member")
public class MemberEntity implements UserDetails {
@Id
@GeneratedValue
private Long idx;
@Column(nullable = false, unique = true, length = 20)
private String id;
@Column(nullable = false, unique = true, length = 30)
private String email;
@Column(nullable = false, length = 20)
private String pw;
@Column(name = "auth")
private String auth;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<GrantedAuthority> roles = new HashSet<>();
for(String role : auth.split(",")) roles.add(new SimpleGrantedAuthority(role));
return roles;
}
@Override
public String getPassword() {
return this.pw;
}
@Override
public String getUsername() {
return this.id;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
@Repository
public class LoginRepository {
@PersistenceContext
private EntityManager em;
public MemberEntity save(MemberEntity member){
em.persist(member);
return member;
}
}
public interface LoginService {
public MemberVo join(MemberDto md);
}
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class LoginServiceImpl implements LoginService{
private final LoginRepository loginRepository;
@Transactional
@Override
public MemberVo join(MemberDto md){
String id = md.getId();
String pw = md.getPw();
String rePw = md.getRePw();
String email = md.getEmail();
MemberEntity me = MemberEntity.builder().id(id).pw(pw).email(email).auth(MemberRoles.MEMBER.getRole()).build();
MemberEntity save = loginRepository.save(me);
return MemberVo.builder().id(save.getId()).build();
}
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/v1")
public class LoginController {
private final LoginService loginService;
@PostMapping(value = "/join")
public ResponseEntity join(@RequestBody MemberDto md){
MemberVo join = loginService.join(md);
CommonV1 result = CommonV1.builder()
.code("200")
.result("success")
.msg("회원가입 성공")
.data(join)
.build();
return ResponseEntity.status(HttpStatus.OK).body(result);
}
}
테스트
확인
실제 데이터가 들어간 것으로 정상적으로 h2 db와 연결되어 있는 것을 확인할 수 있었다.
다음 시간에는 테스트로만 만든 회원가입 로직을 정말 회원가입에 사용할 수 있도록 수정하고 테스트 코드와 api 문서 작업까지 진행해보자!
제가 조금 헷갈려서 그러는데 질문 하나만 드려도 될까요?
@Transactional(readOnly = true)를 하면 성능은 향상되지만 CRUD에서 R만 사용할 수 있다고 알고있는데,
회원가입은 Insert인거 같은데 readOnly true를 쓰면 안되는 것 아닌가요??