반응형
노인 객체는 단순하게 1. 이름 2. 핸드폰 번호 만 받기로 했다
그래서 DTO 를 아래와 같이 설정했다
이름과 핸드폰 자리수에 대한 예외 처리도 DTO 에서 처리했다
package com.example.Mind_in_Canvas.dto.user;
import java.time.LocalDateTime;
import java.util.UUID;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ElderDTO {
private UUID elderid;
@NotBlank(message = "이름은 필수 입력 값입니다")
@Size(max = 100, message = "이름은 100자를 초과할 수 없습니다")
private String elderName;
@NotBlank(message = "전화번호는 필수 입력 값입니다")
@Pattern(regexp = "^\\d{11}$", message = "전화번호는 11자리 숫자만 입력해 주세요")
private String phoneNumber;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
@Builder
public ElderDTO(String elderName, String phoneNumber,
LocalDateTime createdAt, LocalDateTime updatedAt) {
this.elderName = elderName;
this.phoneNumber = phoneNumber;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
}
핸드폰 번호를 고유값으로 받을거라 PhoneNumber 에 Unique 를 주고,
이름만 변경할 수 있도록 Entity 를 만들었다
package com.example.Mind_in_Canvas.domain.user.Elder;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
// import lombok.Setter;
import lombok.Builder;
import lombok.AccessLevel;
// import org.springframework.security.crypto.password.PasswordEncoder;
import java.time.LocalDateTime;
import java.util.UUID;
@Entity
@Table(name = "elder")
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Builder
public class Elder {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "elder_id", nullable = false)
private UUID elderid;
@Column(name = "elder_name", nullable = false)
private String elderName;
@Column(name = "phone_number", unique = true, nullable = false)
private String phoneNumber;
@Column(name = "created_at", nullable = false)
@Builder.Default
private LocalDateTime createdAt = LocalDateTime.now();
@Column(name = "updated_at", nullable = false)
@Builder.Default
private LocalDateTime updatedAt = LocalDateTime.now();
@Builder.Default
private boolean enabled = true;
@Builder.Default
private boolean accountNonExpired = true;
@Builder.Default
private boolean accountNonLocked = true;
@Builder.Default
private boolean credentialsNonExpired = true;
public void createElder(String elderName, String phoneNumber) {
this.elderName = elderName;
this.phoneNumber = phoneNumber;
}
public void setElderName(String elderName) {
if (elderName != null && !elderName.isEmpty() && elderName.length() <= 100) {
this.elderName = elderName;
} else if (elderName == null || elderName.isEmpty()) {
throw new IllegalArgumentException("이름은 필수 입력입니다");
} else {
throw new IllegalArgumentException("이름은 100자를 초과할 수 없습니다");
}
}
public void setPhoneNumber(String phoneNumber) {
if (phoneNumber != null && phoneNumber.matches("\\d{11}")) {
this.phoneNumber = phoneNumber;
} else {
throw new IllegalArgumentException("전화번호는 11자리 숫자만 입력해 주세요");
}
}
public void changeElderName(String newElderName) {
if (newElderName != null && !newElderName.isEmpty() && newElderName.length() <= 100) {
this.elderName = newElderName;
this.updatedAt = LocalDateTime.now();
} else if (newElderName == null || newElderName.isEmpty()) {
throw new IllegalArgumentException("이름은 필수 입력입니다");
} else {
throw new IllegalArgumentException("이름은 100자를 초과할 수 없습니다");
}
}
}
그리고 Repository 설정은 간단하게
이름으로 검색, 핸드폰 번호로 검색을 만들어줬다
package com.example.Mind_in_Canvas.domain.user.Elder;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
import java.util.UUID;
@Repository
public interface ElderRepository extends JpaRepository<Elder, UUID> {
Optional<Elder> findByElderid(UUID elderid);
Optional<Elder> findByPhoneNumber(String phoneNumber);
}
Service 에서 노인을 만들고, 이름을 변경할 수 있는 로직을 설계했다
package com.example.Mind_in_Canvas.domain.user.Elder;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
// import java.util.UUID;
@Service
@RequiredArgsConstructor
public class ElderService {
private final ElderRepository elderRepository;
@Transactional
public void createElder(String elderName, String phoneNumber) {
if (!phoneNumber.matches("^\\d{11}$")) {
throw new IllegalArgumentException("전화번호는 11자리 숫자만 입력해 주세요");
}
if (elderName == null || elderName.isEmpty() || elderName.length() > 100) {
throw new IllegalArgumentException("이름은 필수 입력이며 100자를 초과할 수 없습니다");
}
Optional<Elder> existingElder = elderRepository.findByPhoneNumber(phoneNumber);
if (existingElder.isPresent()) {
throw new IllegalArgumentException("이미 존재하는 사용자입니다");
}
Elder elder = Elder.builder()
.elderName(elderName)
.phoneNumber(phoneNumber)
.enabled(true)
.accountNonExpired(true)
.accountNonLocked(true)
.credentialsNonExpired(true)
.build();
elderRepository.save(elder);
}
@Transactional
public void changeElderName(String newElderName, String phoneNumber) {
// PhoneNumber 로 사용자 검색
Elder existingElder = elderRepository.findByPhoneNumber(phoneNumber)
.orElseThrow(() -> new IllegalArgumentException("해당 전화번호로 사용자를 찾을 수 없습니다"));
// 사용자 이름 업데이트
existingElder.changeElderName(newElderName);
}
}
마지막으로 Controller 에서 이렇게 API 를 만들어주면 노인 만들기 끝!
package com.example.Mind_in_Canvas.domain.user.Elder;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.example.Mind_in_Canvas.dto.user.ElderDTO;
import com.example.Mind_in_Canvas.dto.user.UpdateElderDTO;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/elders")
public class ElderController {
// Constructor Injection 사용 ElderService 주입
@Autowired
public ElderController(ElderService elderService) {
this.elderService = elderService;
}
private ElderService elderService;
@PostMapping("/signup")
public ResponseEntity<Map<String, String>> registerUser(@Valid @RequestBody ElderDTO elderDTO) {
try {
elderService.createElder(
elderDTO.getElderName(),
elderDTO.getPhoneNumber());
Map<String, String> response = new HashMap<>();
response.put("message", "Elder Create Success");
return ResponseEntity.status(HttpStatus.CREATED).body(response);
} catch (IllegalArgumentException e) {
Map<String, String> errorResponse = new HashMap<>();
errorResponse.put("message", e.getMessage());
return ResponseEntity.status(HttpStatus.CONFLICT).body(errorResponse);
}
}
@PostMapping("/changeElderName")
public ResponseEntity<Map<String, String>> changeElderName(@Valid @RequestBody UpdateElderDTO updateElderDTO) {
try {
elderService.changeElderName(
updateElderDTO.getElderName(),
updateElderDTO.getPhoneNumber());
Map<String, String> response = new HashMap<>();
response.put("message", "Elder Update Success");
return ResponseEntity.status(HttpStatus.OK).body(response);
} catch (IllegalArgumentException e) {
Map<String, String> errorResponse = new HashMap<>();
errorResponse.put("message", e.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
}
}
}
Talend API Test 로 elders/signup 을 진행해보면, 201 을 잘 출력함을 확인할 수 있다
UTF8 로 만들었는데 한글은 출력이 안 된다, 나중에 MySQL Work뭐시기로 확인해봐야지
전화번호가 11자리가 아닌 경우 Error MSG 도 잘 출력된다
이름은 달라도 핸드폰 번호가 같으면 등록이 불가하다
elders/changeElderName 도 200 뜨면서 잘 변경됨을 확인할 수 있다
반응형
'TIL > JAVA' 카테고리의 다른 글
[Spring] DTO 와 Entity 의 개념과 차이 (0) | 2025.01.08 |
---|---|
[Spring] 회원 관리 예제 - 웹 MVC 개발 (0) | 2025.01.06 |
[Spring] 스프링 빈과 의존관계 (0) | 2025.01.01 |
[Spring] 회원 관리 예제 - 백엔드 개발 (0) | 2024.12.31 |
[Spring] MVC 와 템플릿 엔진, API (0) | 2024.12.30 |