JWT (JPA)

Yeeun·2025년 5월 28일
0

SpringBoot

목록 보기
41/46

1. DB를 위해 쓸 객체클래스 작성, JPA를 위해 펄시스턴스 인터페이스 생성.

클래스 앞의 @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 로 지정한 필드의 자료형이에요.

2. domain 패키지 내 객체정보로 초기 DB만들기 (src/test/java 서 작성후 ctrl+F11)

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의 의존성으로 포함시키기 때문이에요.

3.컨트롤러 생성

@RestController는 Spring Boot에게 "이 클래스는 웹 요청을 처리하는 컨트롤러야!"라고 알려주는 역할,JPA와는 직접적인 관련이 없습니다.
@Controller + @ResponseBody의 합성 어노테이션입니다.
이 클래스의 모든 메서드가 HTTP 요청을 처리하고, 응답을 JSON이나 XML 등으로 반환한다는 뜻.
겟,포스트 매핑 작성

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

아이디는 user, 콘솔에 뜨는 비번 입력해서 로그인하면
페이지 뜸


1. 왜 로그인 창이 뜨는가?

Spring Security 의존성을 프로젝트에 추가하면,
기본 설정(Default Configuration) 으로 모든 요청은 인증된 사용자만 접근 가능하도록 자동 적용됩니다.

즉, 다음과 같은 흐름이 발생합니다:

  • 사용자가 localhost:8080에 접속하려고 하면,
  • Spring Security는 해당 사용자가 아직 로그인하지 않았다고 판단하고,
  • 자동으로 기본 로그인 페이지(/login) 로 리디렉션합니다.

🟠 기본 로그인 계정 정보는 다음과 같습니다:

  • 아이디: user
  • 비밀번호: 서버 실행 시 콘솔 창에 자동 출력됩니다 (임의 생성됨)

따라서 아무 설정을 하지 않아도, 로그인 페이지가 자동으로 뜨는 이유는 Spring Security의 기본 보안 정책 때문입니다.


2. @RestController에서 "index"를 리턴하면 어떤 일이 일어나는가?

@RestController
public class SecurityController {
	@GetMapping({"/", "/index"})
	public String index() {
		return "index";
	}
}

이 경우 "index"HTML 파일을 렌더링하는 것이 아니라,
단순히 텍스트 데이터 "index"를 HTTP 응답 본문에 담아 반환하는 역할을 합니다.

즉, 브라우저 화면에 단지 index라는 글자만 보이게 됩니다.

이유:

  • @RestController@Controller + @ResponseBody의 조합입니다.
  • 그래서 반환값을 뷰(View) 이름으로 해석하지 않고, HTTP 응답 바디에 그대로 출력합니다.

3. HTML 페이지(index.html)를 띄우고 싶다면?

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. 시큐리티 설정 파일 작성

1. @Configuration

  • 이 클래스가 스프링 설정 클래스임을 나타냅니다.
  • 스프링 컨테이너가 이 클래스를 읽고 내부의 @Bean 메서드를 실행해 빈 객체를 생성하고 관리합니다.

2. @Bean

  • 이 메서드가 반환하는 객체를 스프링 빈으로 등록합니다.
  • 등록된 빈은 다른 곳에서 @Autowired 등으로 주입받아 사용할 수 있습니다.

3. PasswordEncoder passwordEncoder()

  • PasswordEncoder 타입의 빈을 만드는 메서드입니다.
  • 메서드 내부에서 new BCryptPasswordEncoder() 객체를 생성해 반환합니다.
  • BCryptPasswordEncoder는 비밀번호 암호화를 위한 스프링 시큐리티 구현체입니다.

4. 전체 정리

@Configuration
public class SecurityConfig {

    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • 위 코드는 PasswordEncoder 빈을 만들어 스프링 컨테이너가 관리하도록 설정합니다.
  • 이후 다른 클래스에서 @Autowired로 편리하게 주입받아 사용할 수 있습니다.

@Bean을 안붙인 MemberRepository가 어떻게 @Autowired 되는가?

1. MemberRepository가 스프링 빈이 되는 과정

  • MemberRepository는 보통 JpaRepository를 상속한 인터페이스입니다.
  • 스프링 데이터 JPA가 실행될 때, 인터페이스를 기반으로 구현체(프록시 객체)를 자동으로 만들어 스프링 빈으로 등록합니다.
  • 즉, 우리가 직접 @Component@Repository를 붙이지 않아도 스프링 데이터 JPA가 대신 빈을 생성해줍니다.

2. @SpringBootTest 역할

  • @SpringBootTest 어노테이션이 붙은 클래스는 스프링 부트를 실행해 실제 애플리케이션 컨텍스트를 띄웁니다.
  • 이 컨텍스트 안에는 MemberRepository 빈도 포함되어 있기 때문에 @Autowired로 주입이 가능합니다.

3. 요약

  • MemberRepositoryJpaRepository를 상속하면 스프링 데이터 JPA가 빈으로 자동 등록합니다.
  • 테스트 클래스에 @SpringBootTest가 있어서 스프링 컨테이너가 뜨고,
  • @Autowired가 붙은 memRepo에 자동으로 MemberRepository 빈이 주입됩니다.

필요하면 @Repository를 명시적으로 붙이지 않아도 됩니다!

클래스가 빈이 아니라 메소드(passwordEncoder)를 빈으로 하네?

1. 빈(Bean)이란?

스프링에서 관리하는 객체를 이라고 해요.
이 빈을 스프링이 자동으로 만들어서 필요한 곳에 넣어줍니다(의존성 주입).


#2. 빈 만드는 방법 2가지

  • 방법 A: 클래스 위에 @Component, @Service, @Repository 붙이기
    → 스프링이 그 클래스를 보고 빈으로 만들어요.

  • 방법 B: @Configuration 클래스 안에 @Bean 붙인 메소드 만들기
    → 이 메소드가 반환하는 객체를 빈으로 만들어요.


3. MemberRepository는?

  • MemberRepository는 인터페이스예요.
  • 스프링 데이터 JPA가 자동으로 구현 클래스를 만들어서 빈으로 등록해 줘요.
  • 그래서 @Repository 같은 어노테이션을 안 붙여도 자동으로 빈이 만들어져서 @Autowired로 쓸 수 있어요.

4. @Bean 메소드는 왜 쓰나요?

  • 직접 만든 클래스가 아니라 외부 라이브러리 객체를 빈으로 등록할 때 씁니다.
  • 예: PasswordEncoder를 빈으로 등록할 때, 아래처럼 메소드를 써서 빈으로 만들어 줍니다.
@Configuration
public class SecurityConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

요약

  • MemberRepository는 인터페이스라서 스프링이 자동으로 구현해서 빈 만들어줌 → @Autowired 가능
  • 외부 객체 같은 경우는 @Bean 붙인 메소드로 빈 등록

@Configuration은 외부에서 만든 클래스나 내가 직접 만든 객체를 스프링 빈으로 등록하고 설정할 때 사용하는 클래스에 붙이는 어노테이션.
스프링에게 “이 클래스 안에 빈으로 만들 메소드들이 있다”라고 알려주는 역할을 합니다.


두 토큰 차이

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

0개의 댓글