jpa를 사용하여 간단한 회원가입 및 조회 등을 진행해보겠습니다.
vo > RequestUser.java
전달객체
package com.example.userservice.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Data
public class RequestUser {
@NotNull(message = "Email cannot be null")
@Size(min = 2, message = "Email not be less than two characters")
@Email
private String email;
@NotNull(message = "Name cannot be null")
@Size(min = 2, message = "Name not be less than two characters")
private String name;
@NotNull(message = "Password cannot be null")
@Size(min = 8, message = "Password must be less than 8 characters")
private String pwd;
}
dto > UserDto.java
서비스에서 전달하거나 담는 객체
package com.example.userservice.dto;
import lombok.Data;
import java.util.Date;
@Data
public class UserDto {
private String email;
private String name;
private String pwd;
private String userId;
private Date createdAt;
private String encryptedPwd;
}
service > UserService
package com.example.userservice.service;
import com.example.userservice.dto.UserDto;
public interface UserService {
UserDto createUser(UserDto userDto);
}
service > UserServiceImpl
package com.example.userservice.service;
import com.example.userservice.dto.UserDto;
import org.springframework.stereotype.Service;
import java.util.UUID;
@Service
public class UserServiceImpl implements UserService{
@Override
public UserDto createUser(UserDto userDto) {
userDto.setUserId(UUID.randomUUID().toString());
return null;
}
}
JPA 의존성 추가
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
repository > UserEntity
Table의 name이 밑줄이 날 경우 아직 생성되지 않아서이다.
package com.example.userservice.repository;
import lombok.Data;
import javax.persistence.*;
@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 encryptedPwd;
}
repository > UserRepository
실제 DB 연결 및 데이터 처리
package com.example.userservice.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {
}
Service 내에서 데이터를 처리해야되는데
클래스에 데이터를 전달할 때 일일이 세팅해야되는데 이부분에 대해서 처리해주는 기능이 있다.
mapper라는 dependency를 추가해야된다.
pom.xml
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.8</version>
</dependency>
service > UserServiceImpl.java
회원가입 로직 추가
package com.example.userservice.service;
import com.example.userservice.dto.UserDto;
import com.example.userservice.repository.UserEntity;
import com.example.userservice.repository.UserRepository;
import com.netflix.discovery.converters.Auto;
import org.dom4j.rule.Mode;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.modelmapper.spi.MatchingStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;
@Service
public class UserServiceImpl implements UserService {
UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.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.setEncryptedPwd("encrypted_password"); // 추후 수정
// jpa로 저장
userRepository.save(userEntity);
return null;
}
}
controller > UserController.java
서비스에 구현한 createUser 연결
package com.example.userservice.controller;
import com.example.userservice.dto.UserDto;
import com.example.userservice.service.UserService;
import com.example.userservice.vo.Greeting;
import com.example.userservice.vo.RequestUser;
import org.bouncycastle.math.raw.Mod;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/")
public class UserController {
private Environment env;
private UserService userService;
@Autowired
private Greeting greeting;
@Autowired
public UserController(Environment env, UserService userService) {
this.env = env;
this.userService = userService;
}
@GetMapping("/health_check")
public String status() {
return "It's Working in User Service";
}
@GetMapping("/welcome")
public String welcome() {
// return env.getProperty("greeting.message");
return greeting.getMessage();
}
@PostMapping("/users")
public String createUser(@RequestBody RequestUser user) {
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
UserDto userDto = mapper.map(user, UserDto.class);
userService.createUser(userDto);
return "Create user method is called.";
}
}
Postman을 통해서 createUser를 진행해보자!
우선 위에 작성한 코드를 동작하기 위해서 서버를 재실행한다.
주의: 재실행 했을 경우 포트번호가 랜덤이기 때문에 변경되어있다.
변경된 포트번호 기준으로 요청을 해야됩니다.
저의 경우가 62950입니다.
200 상태로 정상요청된것을 볼 수 있습니다.
h2 데이터베이스 콘솔에 가서 확인해보자!
users 테이블이 생성되고 데이터가 들어간 것을 확인할 수 있습니다.
하지만, httpStatus가 200번 보다는 201번이라는 CreateOK라는 형태를 전달하는것이 더 적합할 것 같습니다.
따라서, Controller에서 응답(리턴)값을 수정하겠습니다.
controller > UserController.java > createUser
@PostMapping("/users")
public ResponseEntity createUser(@RequestBody RequestUser user) {
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
UserDto userDto = mapper.map(user, UserDto.class);
userService.createUser(userDto);
return new ResponseEntity(HttpStatus.CREATED);
}
다시 서버 실행후 포트 변경하여 호출 시 200에서 201로 HttpStatus가 변경된 것을 알 수 있습니다.
여기서, 추가적으로 상태값은 적절한데 응답한 결과에 대해서 아무 결과가 없기 때문에 추가하여 전달해보겠습니다.
vo > ResponseUser.java
응답결과 데이터를 담을 객체 생성
package com.example.userservice.vo;
import lombok.Data;
@Data
public class ResponseUser {
private String email;
private String name;
private String userId;
}
controller > UserController.java > createUser (수정)
@PostMapping("/users")
public ResponseEntity<ResponseUser> createUser(@RequestBody RequestUser user) {
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
UserDto userDto = mapper.map(user, UserDto.class);
userService.createUser(userDto);
// 데이터를 저장할 때 사용한 userDto 객체를 responseUser의 응답객체에 맵핑
ResponseUser responseUser = mapper.map(userDto, ResponseUser.class);
return ResponseEntity.status(HttpStatus.CREATED).body(responseUser);
}
service > UserServiceImpl.java
createUser 부분의 return 값이 null 부분을 다시 저장한 데이터값을 기준으로 userDto를 생성하여 return 처리
@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.setEncryptedPwd("encrypted_password"); // 추후 수정
// jpa로 저장
userRepository.save(userEntity);
UserDto returnUserDto = mapper.map(userEntity, UserDto.class);
return returnUserDto;
}
서버 재기동 후 테스트를 해보겠습니다.
주의! 포트 변경하고 진행
이제는 Status가 201 Created일 뿐만 아니라 응답 데이터로 저장된 데이터의 일부분도 같이 확인할 수 있습니다.
SpringBoot MSA (10) - MicroService / UserService API Gateway 처리 (0) | 2023.10.17 |
---|---|
SpringBoot MSA (10) - MicroService / UserService 비밀번호 암호화 (3) (0) | 2023.10.17 |
SpringBoot MSA (10) - MicroService / UserService H2 연결 (1) (2) | 2023.10.16 |
SpringBoot MSA (9) - Spring Cloud Gateway / Load Balancer (0) | 2023.10.10 |
SpringBoot MSA (8) - Spring Cloud Gateway 와 Eureka 연동 (0) | 2023.10.10 |
댓글 영역