Final Project 정리_controller 회원정보 수정
안녕하세요 jju_developer입니다 ^.^
회원 정보 읽기에 관련해서 정리를 했었습니다.
final project 정리_controller(회원 정보 읽기)
안녕하세요 jju_developer입니다. 오늘은 그동안 진행을 했었던 final project에 대한 정리를 해보고자 합니다. 제가 맡은 부분은 회원정보 수정이었습니다. @RestController 어노테이션을 통해서 Rest Api 컨
jju240.tistory.com
이번에는 이어서 회원 정보를 수정에 대해 정리를 해보도록 하겠습니다~
HTTP 메서드 중에서 수정은 바로 PUT을 사용을 합니다!
지난 시간에 모든 코드를 첨부하였으니, 이번에는 해당되는 코드만 간략하게 보겠습니다!
그럼 시작해볼까요?
1. Controller _PutMapping
//회원 정보 수정
@PutMapping("/Modify/{id}")
public ResponseEntity<?> customerModify(@PathVariable Long id, @Validated @RequestBody CustomerModifyDto requestDto) {
customerModifyService.updateCustomer(id, requestDto);
Map<String, Object> map = new HashMap<>();
map.put("message", "JJU 성공");
System.out.println("requestDto = " + requestDto);
return new ResponseEntity<>(map, HttpStatus.OK);
}
URL 은 다음과 같습니다.
/customerModify/Modify/회원번호
@Validated 어노테이션을 사용하여 requestDto 객체의 유효성 검사를 수행하게 합니다.
@RequestBody 어노테이션을 사용하여 요청 본문에 포함된 JSON 데이터를 CustomerModifyDto 객체로 매핑합니다.
잠시 사이드 지식을 말씀드리자면,
클라이언트에서--> 서버로 통신하는 메시지를 요청(request) 리퀘스트,
서버에서--> 클라이언트로 통신하는 메시지를 응답(response) 리스폰스라고 하죠.
웹에서 화면전환(새로고침) 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어집니다.
비동기통신을 하기 위해서는 클라이언트에서 서버로 요청 메시지를 보낼 때,
본문에 데이터를 담아서 보내야 하고,
서버에서 클라이언트로 응답을 보낼 때에도 본문에 데이터를 담아서 보내야 합니다.
이 본문이 바로 body 인 것입니다.
즉, 요청본문 requestBody, 응답본문 responseBody을 담아서 보내야 하기 때문에
@RequestBody 어노테이션을 요청 본문에 포함된 JSON 데이터로 CustomerModifyDto 객체로 매핑하였습니다.
즉, 비동기식 클라-서버 통신을 위해 JSON 형식의 데이터를 주고받는 것입니다~

다시 코드를 보면
//회원 정보 수정
@PutMapping("/Modify/{id}")
public ResponseEntity<?> customerModify(@PathVariable Long id, @Validated @RequestBody CustomerModifyDto requestDto) {
customerModifyService.updateCustomer(id, requestDto);
Map<String, Object> map = new HashMap<>();
map.put("message", "JJU 성공");
System.out.println("requestDto = " + requestDto);
return new ResponseEntity<>(map, HttpStatus.OK);
}
customerModifyService를 사용하여 실제로 회원 정보를 수정하는 메서드를 호출합니다.
이때 id와 requestDto를 매개변수로 전달합니다.
customerModifyService에 정의된 메서드를 보시겠습니다.
2. CustomerModifyService --> updateCustomer
@Service
public interface CustomerModifyService {
//회원 정보 수정
void updateCustomer(Long id, CustomerModifyDto requestDto);
}
인터페이스를 구현한 구현 클래스를 보여드리겠습니다.
@Transactional
@Service
@RequiredArgsConstructor
public class CustomerModifyServiceImpl implements CustomerModifyService {
private final CustomerRepository customerRepository;
private final CustomerModifyRepository customerModifyRepository;
private final PasswordEncoder passwordEncoder;
/* <서비스에서 하는일!>
dto에서 수정 할 회원 정보를 입력하면 그것을 핸들러 한번 거쳐서 엔티티로 바꾼 객체를 customerEntity에 저장한다*/
// 회원 정보 수정
@Override
public void updateCustomer(Long id,CustomerModifyDto requestDto) {
Customer customer = customerRepository.findById(id).get();
customer.updateCustomer(requestDto, passwordEncoder);
customerModifyRepository.save(customer);
}
}
CustomerModifyServiceImpl 클래스는
CustomerRepository, CustomerModifyRepository, PasswordEncoder를 생성자를 통해 주입받고 있습니다.
회원 정보를 수정할 때에 비밀번호 수정에 있어서 가장 많은 시간을 드렸습니다.
아무래도 JWT로 안전하게 비밀번호가 수정이 되어야 하기 때문에 의존성 주입(Dependency Injection)을 통해
PasswordEncoder 객체들을 사용할 수 있도록 하였습니다!
updateCustomer 메서드를 자세히 살펴보겠습니다.
CustomerRepository를 사용하여 주어진 ID에 해당하는 회원을 조회하고,
CustomerModifyDto 객체를 사용하여 회원 정보를 업데이트합니다.
-> dto 객체에는 내가 원하는 부분만 수정을 할 수 있도록 지정하였습니다~
업데이트된 회원 정보는 customerModifyRepository를 사용하여 저장됩니다. 이 과정에서 passwordEncoder를 사용하여 비밀번호를 암호화합니다.
3. CustomerModifyRepository
package com.holdcredit.holdcredit.repository;
import com.holdcredit.holdcredit.domain.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface CustomerModifyRepository extends JpaRepository<Customer, Long> {
@Query("UPDATE Customer c SET c.password = :password WHERE c.id = :customer_no")
@Modifying
void pwdUpdate(@Param("customer_no") Long id, @Param("password") String password);
}
위 코드는 CustomerModifyRepository 인터페이스입니다.
해당 인터페이스는 JpaRepository를 상속하고 있어 JPA 기능을 사용할 수 있게 해 줍니다.
CustomerModifyRepository는 Customer 엔티티와 관련된 데이터베이스 작업을 처리하기 위한 메서드들을 정의하고 있습니다.
pwdUpdate 메서드는 @Query 어노테이션을 사용하여 직접 SQL 쿼리를 작성하였습니다.
해당 쿼리는 Customer 엔티티의 password 필드를 업데이트하는 역할을 하며,
@Param 어노테이션을 사용하여 쿼리에서 사용되는 매개변수를 바인딩합니다.
@Modifying 어노테이션은 해당 메서드가 데이터베이스 변경 작업을 수행하는 것을 나타냅니다.
따라서 CustomerModifyRepository 인터페이스는 Customer 엔티티와 관련된 데이터베이스 작업을 위한 메서드들을 정의하고 있으며, pwdUpdate 메서드를 통해 회원의 비밀번호를 업데이트할 수 있습니다.
4. 확인 작업 : 데이터베이스!
1000021의 회원 정보를 바꿔보도록 하겠습니다.
4. 확인 작업 : 포스트멘
PUT 매핑을 설정해 주고 url을 그대로 작성해 줍니다.
Body에서 JSON 형식으로 보내기로 설정을 하고
dto에서 변경한다고 한 값만 넣어줍니다.
비밀번호를 1234로 변경하고 이메일과 폰번호도 각각 수정하여 send를 해보겠습니다.

이렇게 정보가 수정이 잘 되었다고 뜨네요?
그럼 다시 데이터베이스에 가서 바뀌었는지 확인해 보겠습니다~
정보 수정 완료입니다~~~!!
긴 설명 읽어 주셔서 감사합니다.
오늘도 수고하셨습니다.
