클래스 앞의 @Entity 어노테이션은 jpa쓸거다 . 이거 db랑 연결할거야 객체인데 테이블로바꿔야해 알려주는거
JPA의 리플렉션 개념(객체 만들고 메소드 호출 안해도 되는거)을 쓰기위해선
@AllArgsConstructor
@NoArgsConstructor 를 적어둬 리플렉션으로 객체생성시에 문제가 없도록 해야함.
JPA는 자바는 오브젝트 / 디비는 테이블이여서 객체와 테이블간의 연결을 이제까진 DB쿼리로 불러온걸 쉽게 하기위해 고안된 것.
객체를 테이블로 , 테이블을 객체로 변경 함. ORM obeject relational mapping.
@Enumerated(EnumType.STRING) 는 이넘을 테이블로 저장할때 문자열 그대로 저장하겠단 것.
@Id는 아래있는 필드를 테이블의 아이디값으로 쓰겠단 것

private boolean enabled;
가령, 회원탈퇴시 실제 유저를 삭제하지 않고도 로그인을 무효화시키기 위해 멤버필드에 enabled 필드를 넣은 것.
false인 경우 , 디비에 데이터가 있어도 인가필터에서 enabled = false 로 되어있어 접근을 막음. 즉, 비활성화된 계정으로 처리 . 개인정보 3년보관의무
JpaRepository<T, ID> 에서
T 는 엔티티(Entity) 클래스 타입을 의미해요.
예를 들어 Member, Product 같은 JPA가 관리하는 클래스죠.
ID 는 그 엔티티 클래스의 기본 키(primary key) 의 타입을 말해요.
즉, @Id 로 지정한 필드의 자료형이에요.

memRepo.save(Member.builder() .... ) 이 코드에서 멤버를 선언한적 없었는데 쓸 수 있는 이유
MemberRepository가 JpaRepository<Member, String>을 상속하고 있기 때문에,
save() 메서드의 매개변수 타입도 자동으로 Member가 되는 거 .
JPA가 이 저장소는 Member 객체를 다루는 거구나! 하고 알아차림
그래서 save()는 Member 타입만 받게 됨
Member.builder() 사용도 같은 패키지이기 때문에 별도 import 없이 가능


테스트쪽 패키지라 패키지가 다른거 아닌가 ?
package ruby.paper.domain; 이게 사실상 domain 패키지에 있는 거. 그래서 Member는 같은 패키지라서 바로 쓸 수 있고, MemberRepository는 다른 패키지라면 import로 가져온 거
import ruby.paper.persistence.MemberRepository;
src/test/java는 src/main/java를 import해서 사용할 수 있어요.
왜냐하면 빌드 툴이 main을 기본적으로 test의 의존성으로 포함시키기 때문이에요.
@RestController는 Spring Boot에게 "이 클래스는 웹 요청을 처리하는 컨트롤러야!"라고 알려주는 역할,JPA와는 직접적인 관련이 없습니다.
@Controller + @ResponseBody의 합성 어노테이션입니다.
이 클래스의 모든 메서드가 HTTP 요청을 처리하고, 응답을 JSON이나 XML 등으로 반환한다는 뜻.
겟,포스트 매핑 작성

이거 치고 localhost:8080치면 로그인 창 뜸 . 스프링 시큐리티 의존성을 추가했기에.

아이디는 user, 콘솔에 뜨는 비번 입력해서 로그인하면 
페이지 뜸
Spring Security 의존성을 프로젝트에 추가하면,
기본 설정(Default Configuration) 으로 모든 요청은 인증된 사용자만 접근 가능하도록 자동 적용됩니다.
localhost:8080에 접속하려고 하면,🟠 기본 로그인 계정 정보는 다음과 같습니다:
user따라서 아무 설정을 하지 않아도, 로그인 페이지가 자동으로 뜨는 이유는 Spring Security의 기본 보안 정책 때문입니다.
@RestController에서 "index"를 리턴하면 어떤 일이 일어나는가?@RestController
public class SecurityController {
@GetMapping({"/", "/index"})
public String index() {
return "index";
}
}
이 경우 "index"는 HTML 파일을 렌더링하는 것이 아니라,
단순히 텍스트 데이터 "index"를 HTTP 응답 본문에 담아 반환하는 역할을 합니다.
즉, 브라우저 화면에 단지 index라는 글자만 보이게 됩니다.
@RestController는 @Controller + @ResponseBody의 조합입니다.HTML 템플릿을 렌더링하려면 Thymeleaf(타임리프) 템플릿 엔진 의존성을 추가해야함.
HTML을 렌더링하고 싶다면 @Controller를 사용하고,
템플릿 파일을 resources/templates/ 디렉토리에 두어야 합니다.
@Controller
public class WebController {
@GetMapping("/")
public String index() {
return "index"; // templates/index.html을 렌더링
}
}
그리고 resources/templates/index.html 파일을 아래와 같이 생성합니다:
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<h1>Hello, Spring!</h1>
</body>
</html>
이렇게 하면 /로 접속했을 때 실제 HTML 페이지가 화면에 출력됩니다.
#4. 시큐리티 설정 파일 작성
@Configuration@Bean 메서드를 실행해 빈 객체를 생성하고 관리합니다.@Bean@Autowired 등으로 주입받아 사용할 수 있습니다.PasswordEncoder passwordEncoder()PasswordEncoder 타입의 빈을 만드는 메서드입니다.new BCryptPasswordEncoder() 객체를 생성해 반환합니다.BCryptPasswordEncoder는 비밀번호 암호화를 위한 스프링 시큐리티 구현체입니다.@Configuration
public class SecurityConfig {
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
PasswordEncoder 빈을 만들어 스프링 컨테이너가 관리하도록 설정합니다.@Autowired로 편리하게 주입받아 사용할 수 있습니다.@Autowired 되는가?MemberRepository가 스프링 빈이 되는 과정MemberRepository는 보통 JpaRepository를 상속한 인터페이스입니다.@Component나 @Repository를 붙이지 않아도 스프링 데이터 JPA가 대신 빈을 생성해줍니다.@SpringBootTest 역할@SpringBootTest 어노테이션이 붙은 클래스는 스프링 부트를 실행해 실제 애플리케이션 컨텍스트를 띄웁니다.MemberRepository 빈도 포함되어 있기 때문에 @Autowired로 주입이 가능합니다.MemberRepository가 JpaRepository를 상속하면 스프링 데이터 JPA가 빈으로 자동 등록합니다.@SpringBootTest가 있어서 스프링 컨테이너가 뜨고,@Autowired가 붙은 memRepo에 자동으로 MemberRepository 빈이 주입됩니다.필요하면 @Repository를 명시적으로 붙이지 않아도 됩니다!
스프링에서 관리하는 객체를 빈이라고 해요.
이 빈을 스프링이 자동으로 만들어서 필요한 곳에 넣어줍니다(의존성 주입).
방법 A: 클래스 위에 @Component, @Service, @Repository 붙이기
→ 스프링이 그 클래스를 보고 빈으로 만들어요.
방법 B: @Configuration 클래스 안에 @Bean 붙인 메소드 만들기
→ 이 메소드가 반환하는 객체를 빈으로 만들어요.
MemberRepository는?MemberRepository는 인터페이스예요.@Repository 같은 어노테이션을 안 붙여도 자동으로 빈이 만들어져서 @Autowired로 쓸 수 있어요.@Bean 메소드는 왜 쓰나요?PasswordEncoder를 빈으로 등록할 때, 아래처럼 메소드를 써서 빈으로 만들어 줍니다.@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
MemberRepository는 인터페이스라서 스프링이 자동으로 구현해서 빈 만들어줌 → @Autowired 가능@Bean 붙인 메소드로 빈 등록@Configuration은 외부에서 만든 클래스나 내가 직접 만든 객체를 스프링 빈으로 등록하고 설정할 때 사용하는 클래스에 붙이는 어노테이션.
스프링에게 “이 클래스 안에 빈으로 만들 메소드들이 있다”라고 알려주는 역할을 합니다.

두 토큰 차이
| 종류 | 역할 | 위치 | 설명 |
|---|---|---|---|
UsernamePasswordAuthenticationToken | 인증을 시도하기 위한 스프링 시큐리티 내부 토큰 | 서버 내부 | 사용자명과 비밀번호 정보를 담고, 인증 처리에 사용됨 |
| JWT 토큰 | 인증 성공 후 클라이언트에게 발급되는 토큰 | 클라이언트-서버 | 사용자 정보와 인증 상태를 담아 클라이언트에 전달함 |