TIL/JAVA

[Spring] 노인 객체

아람2 2025. 1. 10. 21:19
반응형

노인 객체는 단순하게 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 뜨면서 잘 변경됨을 확인할 수 있다 

 

반응형