각 사용자의 권한을 부여하기 위해 Role과 관련된 테이블을 추가해줬습니다. 사용자(User)와 권한(Role) 간에는 다대다 관계가 있습니다. 즉, 한 사용자가 여러 개의 권한을 가질 수 있고, 한 권한도 여러 사용자에게 할당될 수 있습니다. 매핑 테이블을 만들 때는 보통 각각의 주요 테이블의 기본키(primary key)를 외래키(foreign key)로 참조하며, 이 외래키들이 결합하여 복합 기본키를 형성합니다. 여기서는 "user_role"이라는 매핑 테이블을 만들어 사용자와 권한 간의 다대다 관계를 나타낼 것입니다. user_role 테이블은 다음과 같은 구조를 가집니다. user_id: 사용자를 식별하는 외래키 role_id: 권한을 식별하는 외래키 💻 프로젝트 적용 1️⃣ mySql에 테이블..
사용자 인증 방식은 일반적으로 세션 기반 방식과 토큰 기반 방식(JWT)이 있습니다. 각 방식의 장단점이 있어 상황에 맞게 결정하여 사용하는 것이 중요합니다. 지난 팀 프로젝트의 경우에는 서버 사이드 렌더링 방식이기 때문에 세션 방식을 사용해 구현했었는데요. 이번 개인 프로젝트에서는 클라이언트 사이드 렌더링 방식으로 한 웹 페이지이기 때문에 확장성을 고려하여 토큰 기반 방식으로 구현해보려고 합니다. 한참을 공부하고 헤매이면서 구현한 과정이라 추후에 필요한 부분은 수정, 또 수정을 거쳐서 상세히 기록해보려고 합니다. 1️⃣ 라이브러리 설정 Spring Security와 JWT를 사용하기 위해 다음 라이브러리들을 추가해줍니다. build.gradle dependencies { // Spring Securit..
보안성을 위해 회원가입 시 비밀번호와 비밀번호 확인 필드의 값이 일치하는지 확인하는 과정입니다. 처음에는 아무것도 모르고 비밀번호2 라는 컬럼을 DB에 생성했더랬죠... 하지만 그럴 필요없이 DTO와 프론트단에 필드만 만들어주면 됩니다! [React] Register.js password2 필드를 추가해줍니다. {/* 비밀번호 */} 비밀번호 {/* 비밀번호 확인 */} 비밀번호 확인 UserDTO.java private String password2; 를 추가해줍니다. @JsonProperty("password2") @NotBlank(message = "비밀번호는 필수 입력 값입니다.") @Pattern(regexp = "(?=.*[a-z])(?=.*[0-9]).{8,16}$", message = "비..
UserDTO에 @Valid 사용 build.gradle implementation 'org.springframework.boot:spring-boot-starter-validatio import import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; @NotBlank @Pattern @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder public class UserDTO { private Long id; @JsonProperty("userId") @NotBlank(message = "아이디는 필수 입력 값입니다.") privat..
아이디 입력 필드 옆에 아이디 중복 확인 버튼을 구현했었는데 회원가입 버튼을 누를 시 다시 한번 확인하고 resoponse 해주는 부분을 구현했습니다. ResDTO 먼저 모든 API의 Response에 대해 공통으로 감싸줄 수 있는 ResDTO를 새롭게 만들어 주었습니다. 🧐 그렇다면 ResDTO를 만드는 이유는 무엇일까요? Response에서 요청된 응답 값만 전달해주는게 아니라 결과에 대한 코드, 내용, 에러메세지 등을 같은 포맷으로 전달해주어 프론트에서 더 효율적으로 사용하게 하기 위한 목적입니다! 또한, 객체 지향적인 설계를 촉진합니다. ResDTO 객체를 사용함으로써 응답 데이터를 하나의 객체로 추상화하고, 응답 생성 및 전달에 관련된 로직을 한 곳에서 관리할 수 있게 됩니다. 서버 사이드 렌더..
1️⃣ 문자열 나누기 문제 설명 문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다. 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다. 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다. s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다. 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다. 문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solut..
WebSecurityConfig.java PasswordEncoder를 빈으로 등록합니다. @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } PasswordEncoder는 주로 사용자의 비밀번호를 해싱(hashing)하여 저장하고, 로그인 시에 비밀번호를 검증하는 데 사용됩니다. 여기서 BCryptPasswordEncoder는 PasswordEncoder의 구현체 중 하나로, BCrypt 해싱 알고리즘을 사용하여 비밀번호를 안전하게 해싱합니다. UserService.java package com.example.demo.service; import com.example.demo.dto.ResDTO; im..
툴 변경 이유? 지난 글에서 계속 java.lang.ClassNotFoundException: Cannot find implementation for com.example.demo.mapper.UserMapper 오류가 난다고 했었는데요. 구글링 하며 온갖 방법을 다 써봐도 (의존성 설정 순서도 중요하다고 해서 다 해봤는데도....ㅠㅠ) 해결이 되지 않았습니다. 이클립스의 문제라고 하는 글들도 있어서 결국 선택한 해결 방법이 Tool을 바꾸는 것이었습니다. ( 해결이라고 해도 되나 싶네요. ) 그렇게 다들 인텔리제이 인텔리제이 할 때 학생용 이메일을 잊어버렸고, 유료로 쓰자니 취준생에겐 꽤 부담이 되어서 그간 흐린 눈 했었는데요. 이번에 방통대 편입을 하면서 새로운 학생용 메일이 생겼습니다! 👍 http..
Entity와 DTO Entity 엔티티는 데이터베이스 테이블에 매핑되는 객체입니다. 주로 데이터베이스의 상태를 나타내고 비즈니스 로직을 포함할 수 있습니다. 보통 JPA(Java Persistence API)와 함께 사용되어 데이터베이스와 상호 작용합니다. 데이터베이스의 구조를 반영하고, 데이터베이스 연산(CRUD)을 수행하는 데 사용됩니다. DTO DTO는 데이터를 전송하기 위한 객체입니다. 주로 클라이언트와 서버 간의 통신에서 사용됩니다. 클라이언트로부터 받은 요청이나 서버에서 보내는 응답에 사용됩니다. 엔티티와는 달리 비즈니스 로직을 포함하지 않으며, 주로 데이터 전송을 위한 필드를 갖습니다. MapStruct 자바 언어용 객체-객체 매핑 라이브러리입니다. 자동으로 매핑 코드를 생성하여 반복적이고..
공부를 안한 게 아니고요... 날마다 일어나는 새로운 오류에 정신을 못차리고 있습니다. 이제 회원관리 구현하는데 이게 무슨...ㅠㅠ 아무튼 며칠 시달리다가 겨우 해결한 오류를 기록해보겠습니다. 일단 회원가입 기능을 구현하는데 react에서 axios를 사용해 POST 메서드로 요청을 보내면 계속 PropertyValueException 오류가 났습니다. 에러 메세지 org.hibernate.PropertyValueException: not-null property references a null or transient value : com.example.demo.entity.UserEntity.email 디버깅을 해보면 값이 안들어오고 죄다 null인 모습을 볼 수 있습니다.. 그 와중에 password..