gi_dor

시큐리티로 로그인한 회원 정보 조회 , 수정 - SpringSecurity, MySQL , MyBatis 본문

Back_End/SpringBoot

시큐리티로 로그인한 회원 정보 조회 , 수정 - SpringSecurity, MySQL , MyBatis

기돌 2024. 4. 17. 16:38

사용자 정보 조회

VO

@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Long no;
    private String id;
    private String password;
    private String name;
    private String email;
    private LocalDateTime createdDate;
    private LocalDateTime updatedDate;
    private String tel;
    private String zipCode;
    private String address;
    private String addressDetail;
    private String delYn;

    public String getFullAddress() {
        return String.format("%s %s %s", zipCode,address,addressDetail);
    }
}

XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.bookhub.user.mapper.UserMapper">

    <resultMap id="UserResultMap" type="com.example.bookhub.user.vo.User">
        <id column="user_no" property="no" />
        <result column="user_id" property="id" />
        <result column="user_password" property="password" />
        <result column="user_name" property="name" />
        <result column="user_email" property="email" />
        <result column="user_created_date" property="createdDate" />
        <result column="user_updated_date" property="updatedDate" />
        <result column="user_tel" property="tel" />
        <result column="user_zip_code" property="zipCode" />
        <result column="user_address" property="address" />
        <result column="user_address_detail" property="addressDetail" />
        <result column="user_del_yn" property="delYn" />
    </resultMap>

    <!-- 사용자 정보조회 -->
    <select id="selectUserById" parameterType="string" resultMap="UserResultMap">
        SELECT user_no ,
               user_id ,
               user_password ,
               user_name ,
               user_email ,
               user_tel ,
               user_zip_code ,
               user_address,
               user_address_detail ,
               user_created_date ,
               user_updated_date,
               user_del_yn
        FROM USER
        WHERE user_id = #{id}
        and user_del_yn = 'N'
    </select>

    <!-- 회원 정보 변경 -->
    <update id="updateUser" parameterType="com.example.bookhub.user.vo.User">
        update USER
        set
            user_email = #{email},
            user_tel = #{tel},
            user_zip_code = #{zipCode},
            user_address = #{address},
            user_address_detail = #{addressDetail}
        WHERE user_id = #{id}
    </update>

</mapper>

Mapper

@Mapper
public interface UserMapper {
    User selectUserById(String id);
    void updateUser(User user);
}

Service

@Service
@RequiredArgsConstructor
public class UserService implements UserDetailsService {

    private final UserMapper userMapper;
    private final PasswordEncoder passwordEncoder;

/**
     * 주어진 아이디에 해당하는 사용자를 데이터베이스에서 찾는다
     * @param id 사용자 아이디
     * @return 선택된 사용자
     * @throws RuntimeException 주어진 아이디에 해당하는 사용자를 찾을 수 없는 경우 발생
     */
    public User selectUserById(String id) {
        System.out.println(id);
        User user = userMapper.selectUserById(id);
        if (user == null) {
            throw new RuntimeException("해당 아이디에 해당하는 사용자를 찾을 수 없습니다: " + id);
        }
        return user;
    }


/**
    *  사용자 정보를 수정하는 메서드
    * @param user 수정할 사용자 정보를 담은 User 객체
    * @return 업데이트 (수정)된 사용자 정보를  담은 User 객체
    */
    public User modifyUserInfo(User user) {
        userMapper.updateUser(user);

        return user;
    }

}

Controller

@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping("/user")
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);
    private final UserService userService;

     /**
     * 현재 로그인한 사용자의 회원 정보를 조회하는  메서드
     *
     * @param model View에 전달할 데이터를 담는 Model 객체
     * @param principal 현재 로그인한 사용자의 Principal 객체
     * @return 회원 정보 페이지의 뷰.html 이름
     */
    // 로그인 - 마이페이지 - 회원정보 조회
    @PreAuthorize("isAuthenticated()")
    @GetMapping("/mypage/userInfo")
    public String userInfo(Model model , Principal principal) {

        String userId = principal.getName();
        User user = userService.selectUserById(userId);
        model.addAttribute("user" , user);
        return "user/userInfo";

    }

    /**
     * 회원 정보 수정 페이지를 제공하는  메서드.
     *
     * @param model View에 전달할 데이터를 담는 Model 객체
     * @param principal 현재 로그인한 사용자의 Principal 객체
     * @return 회원 정보 수정 페이지의 뷰.html  이름
     */
    @PreAuthorize("isAuthenticated()")
    @GetMapping("/mypage/modifyUserInfoForm")
    public String modifyForm(Model model , Principal principal) {

        log.info("유저 아이디 log: " +principal.getName());
        System.out.println("유저 아이디  sop : " +principal.getName());

        // 현재 로그인한 사용자의 ID
        String userId = principal.getName();
        User user = userService.selectUserById(userId);

        // 회원 정보를 입력칸에 채워넣기
        model.addAttribute("user",user);

        return "user/modifyUserInfo";
    }


    /**
     * 사용자 정보를 수정하는 POST 요청을 처리하는  메서드
     *
     * @param principal 현재 로그인한 사용자의 Principal 객체
     * @param user 수정된 사용자 정보를 포함하는 User 객체
     * @return 사용자 정보 수정 후 사용자 정보 페이지로 리다이렉트하는 URL주소
     */
    @PreAuthorize("isAuthenticated()")
    @PostMapping("/mypage/modifyUserInfo")
    public String modifyUser(Principal principal , User user){

        String id = principal.getName();
        User userId = userService.selectUserById(id);

        userId.setTel(user.getTel());
        userId.setEmail(user.getEmail());
        userId.setZipCode(user.getZipCode());
        userId.setAddress(user.getAddress());
        userId.setAddressDetail(user.getAddressDetail());

        userService.modifyUserInfo(user);

        return  "redirect:/user/mypage/userInfo";
    }

🔒 error

사용자 정보 조회 후 정보 수정이 되지 않습니다

preparing : 
update User
set
    user_email = ? , 
    user_tel = ? , 
    user_zip_code=? , 
    user_address = ?,
    user_address_detail = ?
where user_id = ?


parameters : null , null , 08081(String) , null , null 
Updates: 0

로그를 확인하면 이렇게 나와있습니다

null 값이 들어갔는데 , user_zip_code 만 String 타입으로 08081의 값이 들어간것을 확인했씁니다

 

📌 원인

 

네트워크 - 페이로드를 보면 데이터가 no , delYn , zipCode 3종류만 존재 하는것을 확인할수 있습니다

<input type="text" class="form-control" th:value="${user.tel}" />
<input type="text" class="form-control" th:value="${user.email}"  />
<input type="text" id="sample6_postcode" class="form-control" th:name="zipCode" th:value="${user.zipCode}">
<input type="text" id="sample6_address"  th:value="${user.address}" placeholder="주소" class="form-control mb-1" >
<input type="text" id="sample6_detailAddress"  th:value="${user.addressDetail}" placeholder="상세주소" class="form-control">

 

zipCode 에만  th:name="zipCode" name 이 존재하고 있습니다  

<input type="text" id="sample6_postcode" class="form-control" th:name="zipCode" th:value="${user.zipCode}">

 

💡 해결 방법

<input type="text" class="form-control" th:name="tel" th:value="${user.tel}" />
<input type="text" class="form-control" th:name="email" th:value="${user.email}"  />
<input type="text" id="sample6_postcode" class="form-control" th:name="zipCode" th:value="${user.zipCode}">
<input type="text" id="sample6_address"  th:name="address" th:value="${user.address}"  placeholder="주소" class="form-control mb-1" >
<input type="text" id="sample6_detailAddress"  th:name="addressDetail" th:value="${user.addressDetail}" placeholder="상세주소" class="form-control">

 

 

 Preparing: 
 update USER 
 set 
    user_email = ?,
    user_tel = ?, 
    user_zip_code = ?, 
    user_address = ?, 
    user_address_detail = ?
WHERE user_id = ?

 Parameters: rltjs9694@gmail.com(String), 
 010-1234-5678(String),
 12275(String), 
 경기 남양주시 와부읍 덕소로 270(String), 
 홈홈 마이홈 스윗홈(String), 
 rltjs987(String)
 
Updates: 1
728x90