유저 정보를 관리하는 서비스
// appication.yml
server:
port: 0 // 포트번호 랜덤
spring:
application:
name: user-service
eureka:
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
포트번호는 Load Balancer처리를 위해 랜덤으로 지정
dependencies {
...
implementation 'com.h2database:h2:1.3.176'
...
}
...
spring:
application:
name: user-service
h2:
console:
enabled: true
settings:
web-allow-others: true
path: /h2-console
...
path는 h2-console로 설정
localhost:{port}/h2-console
로 접속
testdb가 잘 생성된 것을 확인할 수 있다.
POST
-> /users
RequestUser
클래스 생성@Notnull
, @Size
등의 validation
체크를 위한 spring-boot-starter-validation
의존성 추가// RequestUser.java
import lombok.Data;
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 to characters")
private String name;
@NotNull(message = "Password cannot be null")
@Size(min = 8, message = "Password must be equal or greater than 8 characters")
private String pwd;
}
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;
}
// UserService.java
import com.example.userservice.dto.UserDto;
public interface UserService {
UserDto createUser(UserDto userDto);
}
// UserServiceImpl.java
@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.setEncryptedPwd("encrypted_password");
userRepository.save(userEntity);
return null;
}
}
spring-boot-starter-data-jpa
// UserEntity.java
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;
}
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<UserEntity, Long> {}
import com.example.userservice.dto.UserDto;
import com.example.userservice.service.UserService;
import org.modelmapper.ModelMapper;
import com.example.userservice.vo.RequestUser;
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
public UserController(Environment env, UserService userService) {
this.env = env;
this.userService = userService;
}
@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";
}
}
DB에 저장된 모습을 확인할 수 있다.
@PostMapping("/users")
public ResponseEntity createUser(@RequestBody RequestUser user) {
...
return new ResponseEntity(HttpStatus.CREATED);
}
201 Created로 반환된다.
import lombok.Data;
@Data
public class ResponseUser {
private String email;
private String name;
private String userId;
}
@PostMapping("/users")
public ResponseEntity createUser(@RequestBody RequestUser user) {
...
ResponseUser responseUser = mapper.map(userDto, ResponseUser.class);
return ResponseEntity.status(HttpStatus.CREATED).body(responseUser);
}
@Override
public UserDto createUser(UserDto userDto) {
...
UserDto returnUserDto = mapper.map(userEntity, UserDto.class);
return returnUserDto;
}