| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- scanner
- 삼항 연산
- 상속
- Integer.MAX_VALUE
- super()
- 중첩for문
- 문자열
- javascript
- rs.next()
- 이클립스
- Integer.MIN_VALUE
- arraylist
- jsp
- 다형성
- 메소드
- 배열
- 상수
- Else If
- 오버로딩
- 자바
- 삼항 연산식
- interface
- for문
- 인터페이스
- 이중 배열
- If
- extends
- Break
- 2차원 배열
- docker
- Today
- Total
개발로드
☆KDT 2024-04-04★SpringBoot-Maven-암호화, 어노테이션,회원가입 본문
회원가입
signUp.html
<div class="container mx-auto ">
<div class="text-center mt-5">
<h2 class="mt-4 mb-3 ">회원 가입</h2>
</div>
<div class="content border col-md-7 mx-auto">
<form action="member/signUp" role="form" method="post" th:object="${memberDto}" class="pl-5">
<div class="form-group col-md-8 mt-3">
<label th:for="name">이름</label>
<input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력해주세요">
<p th:if="${#fields.hasErrors('name')}" th:errors="*{name}" class="fieldError">입력 오류</p>
</div>
<div class="form-group col-md-8">
<label th:for="email">이메일주소</label>
<input type="email" th:field="*{email}" class="form-control" placeholder="이메일을 입력해주세요">
<p th:if="${#fields.hasErrors('email')}" th:errors="*{email}" class="fieldError">입력 오류</p>
</div>
<div class="form-group col-md-8">
<label th:for="password">비밀번호</label>
<input type="password" th:field="*{password}" class="form-control" placeholder="비밀번호 입력">
<p th:if="${#fields.hasErrors('password')}" th:errors="*{password}" class="fieldError">입력 오류</p>
</div>
<div class="form-group col-md-8">
<label th:for="address">주소</label>
<input type="text" th:field="*{address}" class="form-control" placeholder="주소를 입력해주세요">
<p th:if="${#fields.hasErrors('address')}" th:errors="*{address}" class="fieldError">입력 오류</p>
</div>
<div class="text-center mb-3">
<button type="submit" class="btn btn-primary" style="">Submit</button>
</div>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
</form>
</div>
</div>
실행화면

Jquery
//회원가입시 실패하면 에러 메시지 경고창 보여주기
$(document).ready(function () {
const errorMessage = [[${errorMessage}]];
if (errorMessage != null) {
alert(errorMessage);
}
});//전체 함수 끝
코드설명
- errorMessage라는 변수를 사용합니다. 이 변수는 어떤 값이든 포함할 수 있는 배열입니다.
- 배열은 ${errorMessage}라는 플레이스홀더를 포함합니다.
- ${errorMessage}는 문자열 템플릿 리터럴의 구문입니다. 이 표현식은 어떤 값이 errorMessage에 들어있는지 나타내는 것으로 추측됩니다.
- errorMessage가 null이 아닌 경우, alert() 함수를 사용하여 경고창에 errorMessage를 표시합니다.
- alert() 함수는 브라우저에서 경고 창을 표시하는 내장 함수입니다.
- 따라서 errorMessage가 null이 아닌 경우 사용자에게 경고 메시지가 표시됩니다.
- 여기서 고려해야 할 중요한 점은 errorMessage가 무엇을 포함하는지에 따라 경고 메시지가 달라진다는 것입니다.
- 즉, errorMessage가 배열로 구성되어 있고 해당 배열에 특정 값이 들어있는 경우 해당 값이 경고창에 표시됩니다.
암호화
//비밀번호를 데이터베이스에게 암호화하여 저장
//BCryptPasswordEncoder 의 해시 함수를 이용하여 비밀번호를 암호화하여 저장
// 스프링 프레임워크에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는데 사용할 수 있는 메소드들을
// 가진 클래스
//자바 서버 개발을 위해 필요한 인증, 권한 부여 및 기타 보안 기능을 제공하는 프레임워크
//BCryptPasswordEncoder 를 빈으로 등록해서, 스프링 컨테이너에 등록
//Spring 컨테이너에 의해서 관리되는 빈을 생성
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
코드설명-@Bean, PasswordEncoder, new BCryptPasswordEncoder()
@Bean:
@Bean 어노테이션은 스프링 프레임워크에서 사용되며, 이 어노테이션이 붙은 메서드가 스프링 컨테이너에게 빈(Bean)을 제공한다는 것을 나타냅니다.
public PasswordEncoder passwordEncoder():
이 메서드는 passwordEncoder 라는 이름의 공개(public) 메서드를 선언합니다.
이 메서드는 PasswordEncoder 타입의 객체를 반환합니다. PasswordEncoder는 스프링 시큐리티에서 제공하는 인터페이스로, 패스워드를 암호화하고 비교하는 메서드들을 정의하고 있습니다.
return new BCryptPasswordEncoder():
BCryptPasswordEncoder 클래스는 스프링 시큐리티에서 제공되는 구현체로, BCrypt 해시 함수를 사용하여 패스워드를 안전하게 암호화합니다.
이 코드는 새로운 BCryptPasswordEncoder 객체를 생성하여 반환합니다. 따라서 이 메서드가 호출될 때마다 새로운 BCryptPasswordEncoder 객체가 생성되어 반환됩니다.
따라서 이 코드는 스프링 애플리케이션에서 사용될 패스워드 암호화를 위해 BCryptPasswordEncoder를 빈으로 등록하는 역할을 합니다. 이후에는 이 빈을 필요로 하는 다른 구성 요소들이 해당 빈을 주입받아 패스워드를 암호화할 수 있게 됩니다.
Enum
public enum Role {//일반 사용자인지 관리자인지 구분하기 위해 권한을 선언
USER,
ADMIN
}//end of enum
MemberDTO
@Getter
@Setter
@ToString
//생성자 생성 안해도 기본 생성자를 생성해줘서 신경 안써도 됨
public class Member {
@NotBlank(message = "아이디 필수 입력")
@Length(min=4, max=10, message = "4~8자 사이로 입력")
private String id;
@NotBlank(message = "이름 필수 입력")
private String name;
@NotBlank(message = "비밀번호 필수 입력")
@Length(min = 8, max = 20, message = "8~20자 사이로 입력")
private String password;
@NotBlank(message = "이메일 필수 입력")
private String email;
@NotEmpty(message = "주소 필수 입력")
private String address;
}//end of class
코드설명-@NotBlank
생성자는 기본생성자를 사용하면 되기 때문에 생략.
@NotBlank 어노테이션은 Bean Validation API에서 제공하는 것으로, 해당 필드가 비어 있지 않고, 공백 문자를 제외한 다른 문자열이 포함되어 있는지를 확인하는 데 사용됩니다.
따라서 @NotBlank 어노테이션은 해당 필드가 비어 있지 않아야 한다는 것을 나타냅니다. 공백 문자열은 허용되지 않습니다. 이것은 주로 문자열 필드에 사용되며, 사용자가 필드에 유효한 값(비어 있지 않은 문자열)을 입력했는지를 확인하는 데 유용합니다.
예를 들어, 위의 코드에서 id 필드에 @NotBlank 어노테이션이 적용되어 있습니다. 이것은 id 필드에 빈 문자열이나 공백 문자열을 허용하지 않음을 의미합니다. 사용자가 유효한 id 값을 입력해야 합니다.
코드설명-@NotBlank(message = "아이디 필수 입력"), Length(min=4, max=10, message="4~8자 사이로 입력"
@NotBlank(message = "ID가 필수 입력."):
- 이 주석은 필드가 null이 아니고 비어 있지 않은지(공백이 아닌 문자가 하나 이상 포함되어 있는지) 확인합니다.
- 필드가 비어 있는 경우(비어 있거나 공백 문자만 포함) 유효성 검사 오류가 발생합니다.
- message = "ID가 필요합니다" 속성은 유효성 검사에 실패할 경우 표시되는 사용자 정의 오류 메시지를 제공하여 id가 필요함을 나타냅니다.
@Length(min=4, max=10, message = "4~8자리 사이를 입력"):
- 이 주석은 문자열의 길이를 확인합니다.
- min 속성은 문자열에 허용되는 최소 길이를 지정합니다(이 경우 4).
- max 속성은 문자열에 허용되는 최대 길이를 지정합니다(이 경우 10).
- 문자열의 길이가 지정된 범위(4보다 작거나 10보다 큰 경우)를 벗어나면 유효성 검사 오류가 발생합니다.
- 메시지 = "4~8자리 숫자를 입력하세요" 속성은 유효성 검사에 실패할 경우 표시되는 사용자 정의 오류 메시지를 제공하여 사용자에게 필요한 길이 범위를 알려줍니다.
요약하면 이 코드는 id 필드가 두 가지 유효성 검사 제약 조건을 충족하는지 확인합니다.
결론 => id
비어 있어서는 안 됩니다(null이나 비어 있어서는 안 됨).
길이는 4~10자 사이여야 합니다.
Validation
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
pom.xml에 의존성 추가
Entity
@Getter
@Setter
@ToString
@Entity
@Table(name = "member")
public class Member {
@Id
@Column(name = "member_id")
private String id;
private String name;
private String password;
@Column(unique = true, nullable = false)
private String email;
private String address;
@Enumerated(EnumType.STRING)
private Role role;
public static Member createMember(MemberDto memberDto, PasswordEncoder passwordEncoder){
Member member = new Member();
member.setId(memberDto.getId());
member.setName(memberDto.getName());
//스프링 시큐리티 설정 클래스에 등록한 BCryptPasswordEncoder Bean 을 파라미터로 넘겨서 비밀번호 암호화
String pwd = passwordEncoder.encode(memberDto.getPassword());
member.setPassword(pwd);
member.setEmail(memberDto.getEmail());
member.setAddress(memberDto.getAddress());
member.setRole(Role.USER);
return member;
}//end of createMember
}//end of class
코드설명-@Id, @Column(unique = true, nullable = false), @Column(name="member_id"), @Enumerated(EnumType.STRING)
@Id
@Column(name = "member_id")
String id를 primary key로 설정한다.
데이터베이스의 memberId attribute에 대응시킨다.
@Column(unique = true, nullable = false)
String email을 unique key로 지정하며, null 값을 허용하지 않는다.
unique는 attribute의 중복을 허용하지 않지만, null은 허용하기 때문에.
@Enumerated(EnumType.STRING)
String 타입의 Enum을 사용한다고 알려줌.
코드설명- String pwd = passwordEncoder.encode(memberDto.getPassword());
//스프링 시큐리티 설정 클래스에 등록한 BCryptPasswordEncoder Bean 을 파라미터로 넘겨서 비밀번호 암호화
String pwd = passwordEncoder.encode(memberDto.getPassword());
member.setPassword(pwd);
passwordEncoder.encode(memberDto.getPassword()):
- passwordEncoder는 BCryptPasswordEncoder의 인스턴스로, Spring Security 구성 클래스에 Bean으로 구성 및 등록되어 있습니다.
- encode()는 BCryptPasswordEncoder에서 제공하는 메소드입니다.
- memberDto.getPassword()에서 제공한 비밀번호를 입력으로 사용하고 BCrypt 해싱 알고리즘을 사용하여 암호화된 형식을 반환합니다.
- memberDto.getPassword()에서 제공한 비밀번호는 사용자가 제출한 원시 비밀번호입니다.
String pwd = passwordEncoder.encode(memberDto.getPassword()):
- encode()에 의해 반환된 암호화된 비밀번호는 pwd라는 문자열 변수에 저장됩니다.
- 이 변수는 이제 사용자 비밀번호의 해시된 버전을 보유합니다.
member.setPassword(pwd):
- 'member'는 애플리케이션의 사용자나 멤버를 나타내는 클래스의 인스턴스인 것으로 보입니다.
- pwd에 저장된 암호화된 비밀번호는 이제 이 member 개체의 비밀번호로 설정됩니다.
- 이 단계가 끝나면 'member' 개체는 사용자 비밀번호의 해시된 버전을 보유하여 데이터베이스에 저장하는 등의 저장 또는 추가 처리 준비가 됩니다.
전반적으로 이 코드 세그먼트는 Spring Security에서 제공하는 BCryptPasswordEncoder를 사용하여 사용자의 비밀번호를 안전하게 해싱하여 비밀번호가 안전하고 되돌릴 수 없는 방식으로 저장되도록 하는 프로세스를 보여줍니다.
MemberRepository
public interface MemberRepository extends JpaRepository<Member, String> {
//회원 가입시 중복된 회원이 있는지 검사, id로 회원을 검사
Optional<Member> findById(String id);
}//end of interface
Optional<Member> findById(String id);은 아마도 Spring Data JPA나 비슷한 ORM(Object-Relational Mapping) 프레임워크에서 사용되는 메서드 시그니처일 것입니다.
여기서 findById(String id)는 id 필드를 기반으로 데이터베이스에서 해당하는 레코드를 조회하는 메서드입니다.
findById()는 데이터베이스에서 특정 ID를 가진 레코드를 찾는 메서드입니다.
String id는 찾고자 하는 레코드의 ID를 나타내는 매개변수입니다.
Optional<Member>는 조회된 결과를 나타내며, Java 8 이상에서 도입된 Optional 클래스를 사용하여 해당 값이 존재하지 않을 수도 있는지를 나타냅니다. 이는 NullPointerException을 방지하고, 코드에서 명시적으로 값이 없음을 처리할 수 있도록 합니다.
즉, 이 메서드는 특정 ID에 해당하는 레코드를 조회하고, 그 결과를 Optional<Member> 형태로 반환합니다. 만약 해당하는 레코드가 없다면 Optional.empty()를 반환합니다.
네, 일반적으로 findById(String id) 메서드는 데이터베이스에서 특정 테이블의 primary key로 사용되는 컬럼 값을 기준으로 레코드를 찾는 데 사용됩니다. 따라서 id가 primary key인 경우에 해당 메서드가 사용될 수 있습니다.
Primary key는 테이블의 각 레코드를 식별하는 데 사용되는 고유한 식별자입니다. 일반적으로 primary key는 레코드의 고유성을 보장하고 검색 및 조인을 용이하게 합니다.
따라서 findById(String id) 메서드는 주어진 id 값에 해당하는 레코드를 찾기 위해 primary key로 사용되는 id 컬럼을 기준으로 데이터베이스에서 레코드를 조회합니다. 이를 통해 해당하는 레코드를 식별하고 검색할 수 있습니다.
MemberService
코드설명-@Service, @Transactional, @RequiredArgsConstructor
@Service:
@Service 애노테이션은 해당 클래스가 비즈니스 로직을 담당하는 서비스 클래스임을 나타냅니다.
주로 비즈니스 로직의 처리, 데이터 가공, 트랜잭션 관리 등의 역할을 수행합니다.
Spring IoC 컨테이너에 의해 해당 클래스가 빈(Bean)으로 등록되어 DI(Dependency Injection)를 받을 수 있습니다.
@Transactional:
@Transactional 애노테이션은 트랜잭션 처리를 지원하는 Spring 프레임워크에서 사용됩니다.
해당 애노테이션이 붙은 메서드는 트랜잭션 범위 내에서 실행되며, 메서드 수행 중에 발생하는 모든 DB 관련 작업은 하나의 트랜잭션으로 묶입니다.
메서드 실행 중에 예외가 발생하면 트랜잭션은 롤백되고, 예외가 발생하지 않으면 커밋됩니다.
@RequiredArgsConstructor:
@RequiredArgsConstructor 애노테이션은 Lombok 라이브러리에서 제공하는 기능 중 하나입니다.
해당 클래스에 final이나 @NonNull으로 선언된 필드에 대한 생성자를 자동으로 생성합니다.
생성자 인자로 필드에 대한 값을 전달받아 인스턴스를 초기화합니다.
주로 DI(Dependency Injection)를 받는 빈 클래스에서 사용되어 필드를 초기화하는 코드를 간결하게 작성할 수 있습니다.
따라서 위 코드는 Spring에서 서비스 클래스로 사용되는 빈에 대한 트랜잭션 관리를 포함하며, Lombok의 @RequiredArgsConstructor를 사용하여 필수적인 의존성 주입을 간편하게 처리하는 방식을 보여줍니다.
코드설명-validateDuplicateMember()
Optional<Member> findById(String id);은 데이터베이스에서 특정 ID에 해당하는 회원(Member) 객체를 찾는 메서드 시그니처입니다.
여기서 각 부분을 설명하겠습니다:
Optional<Member>: 메서드가 반환하는 값의 타입입니다. Optional은 Java 8에서 도입된 클래스로, 값이 존재할 수도 있고 존재하지 않을 수도 있는 상황을 다룰 때 사용됩니다. 이 경우, Member 객체를 포함하거나 포함하지 않을 수 있는 옵셔널한 상태를 나타냅니다.
findById(String id): 메서드의 이름입니다. 이 메서드는 주어진 ID에 해당하는 회원(Member) 객체를 데이터베이스에서 찾는 역할을 합니다. 메서드의 매개변수로는 찾고자 하는 회원의 ID가 전달됩니다.
즉, 이 메서드는 주어진 ID에 해당하는 회원을 데이터베이스에서 찾아서 옵셔널한 상태로 반환합니다. 만약 ID에 해당하는 회원이 존재한다면, 해당 회원을 포함한 옵셔널 객체를 반환하고, ID에 해당하는 회원이 존재하지 않는다면 빈 옵셔널 객체를 반환합니다.
Test-password암호화
MemberServiceTest
@Slf4j
@SpringBootTest
@Transactional
@TestPropertySource(locations = "classpath:application-test.properties")
class MemberServiceTest {
@Autowired
MemberService memberService;
@Autowired
PasswordEncoder passwordEncoder;
public Member createMember() {
MemberDto memberDto = new MemberDto();
memberDto.setId("123456789");
memberDto.setName("홍길동");
memberDto.setPassword("abc123412345678");
memberDto.setEmail("test123@email.com");
memberDto.setAddress("서울시 강남구 역삼동");
return Member.createMember(memberDto, passwordEncoder);
}//end of createMember
@Test
@DisplayName("회원 가입 테스트")
public void saveMemberTest() {
Member member = new Member();
member = createMember();
Member savedMember = memberService.saveMember(member);
assertEquals(member.getId(), savedMember.getId());
assertEquals(member.getName(), savedMember.getName());
assertEquals(member.getPassword(), savedMember.getPassword());
assertEquals(member.getEmail(), savedMember.getEmail());
assertEquals(member.getAddress(), savedMember.getAddress());
assertEquals(member.getRole(), savedMember.getRole());
log.info(savedMember.toString());
}//end of saveMemberTest()
로그

password가 암호화되어서 database에 저장되는걸 확인할 수 있다.
코드설명 - assertEquals
assertEquals(member.getId(), savedMember.getId())은 JUnit 또는 유사한 테스트 프레임워크에서 사용되는 메서드로, 두 개의 값이 서로 같은지를 비교하는 역할을 합니다.
assertEquals
JUnit 프레임워크에서 제공하는 메서드 중 하나로, 두 값이 서로 같은지를 비교하는 역할을 합니다. 만약 두 값이 같지 않으면 테스트가 실패하게 됩니다.
member.getId()
member 객체에서 ID 값을 가져오는 메서드 호출입니다. member 객체는 테스트하려는 회원 객체일 것입니다.
savedMember.getId()
savedMember 객체에서 ID 값을 가져오는 메서드 호출입니다. savedMember 객체는 데이터베이스에 저장된 회원 객체일 것입니다.
따라서 assertEquals(member.getId(), savedMember.getId())은 테스트하려는 회원 객체와 데이터베이스에 저장된 회원 객체의 ID가 서로 일치하는지를 확인하는 것입니다. 만약 두 ID가 같다면 테스트가 통과됩니다.
중복 회원 가입 테스트
@Test
@DisplayName("중복 회원 가입 테스트")
public void saveDuplicateMemberTest() {
Member member1 = createMember();
Member member2 = createMember();
memberService.saveMember(member1);
Throwable exception = assertThrows(IllegalStateException.class,() -> memberService.saveMember(member2));
assertEquals("이미 사용중인 아이디입니다.", exception.getMessage());
}//end of saveDuplicateMemberTest
코드설명
Throwable exception = assertThrows(IllegalStateException.class,() -> memberService.saveMember(member2));
assertEquals("이미 사용중인 아이디입니다.", exception.getMessage());
위 코드는 특정 예외가 발생하는지를 테스트하는 데 사용되는 JUnit의 assertThrows 메서드를 사용한 코드입니다. 이 메서드는 주어진 람다 표현식이나 메서드가 특정 예외를 throw하는지를 확인합니다.
assertThrows
JUnit 프레임워크에서 제공하는 메서드로, 특정 예외가 발생하는지를 확인하는 역할을 합니다.
IllegalStateException.class
예외가 발생할 것으로 기대되는 예외의 클래스입니다. 이 경우에는 IllegalStateException 예외가 발생하는지를 확인합니다.
() -> memberService.saveMember(member2)
테스트하고자 하는 코드를 실행하는 람다 표현식입니다. 이 람다 표현식은 memberService.saveMember(member2)를 실행하고, 해당 메서드에서 예외가 발생하는지를 확인합니다.
따라서 assertThrows(IllegalStateException.class,() -> memberService.saveMember(member2))는 memberService.saveMember(member2) 메서드를 실행했을 때 IllegalStateException 예외가 발생하는지를 확인하는 코드입니다. 만약 해당 메서드에서 예외가 발생하지 않는다면, 해당 테스트는 실패하게 됩니다.
중요한 부분
createMember 메소드 생성
public Member createMember() {
MemberDto memberDto = new MemberDto();
memberDto.setId("123456789");
memberDto.setName("홍길동");
memberDto.setPassword("abc123412345678");
memberDto.setEmail("test123@email.com");
memberDto.setAddress("서울시 강남구 역삼동");
return Member.createMember(memberDto, passwordEncoder);
}//end of createMember
객체에 값을 대입
Member member1 = createMember();
Member member2 = createMember();
여기서 중요한 부분

createMember() 메소드 실행시 마다 select Hibernate가 실행됨
그 이유
기존 엔터티 업데이트: id 필드를 설정한 다음 Hibernate를 사용하여 저장하여 기존 엔터티를 업데이트하려는 경우, Hibernate는 제공된 id를 가진 엔터티가 이미 데이터베이스에 존재하는지 확인해야 합니다. . 따라서 업데이트 작업을 진행하기 전에 지정된 id를 가진 엔터티가 데이터베이스에 존재하는지 확인하는 쿼리를 실행할 수 있습니다.
상세 설명
Hibernate 기반 애플리케이션에서 @Entity로 클래스에 주석을 달면, 이는 이 클래스의 인스턴스가 Hibernate의 ORM(Object-Relational Mapping) 기능에 의해 관리되어야 하는 엔터티임을 Hibernate에 표시합니다.
@Entity로 클래스에 주석을 추가하면 다음과 같은 일이 발생합니다.
데이터베이스 테이블에 매핑: Hibernate는 @Entity 주석을 사용하여 클래스를 데이터베이스의 해당 테이블에 매핑합니다. 기본적으로 Hibernate는 클래스 이름을 테이블 이름으로 사용하지만 필요한 경우 @Table 주석을 사용하여 다른 테이블 이름을 지정할 수 있습니다.
엔티티 관리: @Entity로 주석이 달린 엔터티는 Hibernate에 의해 관리됩니다. 이는 Hibernate가 상태를 추적하고 지속성 수명 주기를 관리한다는 의미입니다. Hibernate는 데이터베이스에서 이러한 엔터티의 인스턴스를 유지, 검색, 업데이트 및 삭제하는 방법을 제공합니다.
메타데이터 구성: @Entity 주석은 Hibernate에 대한 메타데이터 역할도 하며 엔터티 클래스의 구조와 속성에 대해 알려줍니다. Hibernate는 이 메타데이터를 사용하여 SQL 쿼리를 생성하고, 엔터티 간의 관계를 처리하고, 다양한 ORM 작업을 수행합니다.
요약하면, 클래스에 @Entity 주석을 달면 해당 클래스의 인스턴스를 데이터베이스 테이블에 매핑되고 Hibernate의 ORM 기능에 의해 관리되어야 하는 엔터티로 처리하도록 Hibernate에 지시하는 것입니다.
결론
@Entity 어노테이션을 사용해서 하이버네이트에 의해 관리되는 entity가 됨. 저절로 데이터베이스의 테이블에 매핑이된다.
따라서 기본 생성자를 생성한 후에 객체의 값들을 업데이트 할 때 이미 데이터베이스에 해당 Id가 있을 수 있으므로 객체에 넣어 줄때 해당 id가 존재하는지 select문으로 확인하는 것이다.
여유가 되신다면 제 GitHub에 오셔서 좋은 코드들을 구경해주세요!

https://github.com/gimpo5975?tab=repositories
gimpo5975 - Overview
gimpo5975 has 6 repositories available. Follow their code on GitHub.
github.com
'JAVA' 카테고리의 다른 글
| ☆KDT 2024-04-08★SpringBoot-Maven-Thymeleaf Layout Dialect (0) | 2024.04.08 |
|---|---|
| ★KDT 2024-04-05☆SpringBoot-Maven- SpringSecurity (0) | 2024.04.05 |
| ★KDT 2024-04-03☆SpringBoot-Maven- SpringSecurity,Test, 계층분리 (0) | 2024.04.03 |
| ☆KDT 2024-04-02★SpringBoot-Maven-JpaRepository (0) | 2024.04.02 |
| ★KDT 2024-04-02☆SpringBoot-Maven-Restful,JPA,@RestController (0) | 2024.04.02 |