도라지보다더덕
240
2020-09-10 15:48:15
2
171

java 문법? 질문


안녕하세요.


스프링 부트 공부 중인 학생입니다. 


자바 공부 후 스프링 부트로 프로젝트 구현 중에 이해가 안되는 부분이 있어 질문드립니다.


rest api 서버를 구현 중이고 스프링 시큐리티를 이용해서 JWT 발급을 하는 코드를 찾아봤는데요.


class 내부에서 


public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

  private final AuthenticationManager authenticationManager;

...

 // Authenticate user
        Authentication auth = authenticationManager.authenticate(authenticationToken);
        return auth;
}

 

이런 부분이 있더라구요. 그래서 AuthenticationManager가 뭔가 싶어 한번 타고 들어갔는데 아래와 같이 나와있었습니다.


public interface AuthenticationManager {
	// ~ Methods
	// ========================================================================================================

	/**
	 * Attempts to authenticate the passed {@link Authentication} object, returning a
	 * fully populated <code>Authentication</code> object (including granted authorities)
	 * if successful.
	 * <p>
	 * An <code>AuthenticationManager</code> must honour the following contract concerning
	 * exceptions:
	 * <ul>
	 * <li>A {@link DisabledException} must be thrown if an account is disabled and the
	 * <code>AuthenticationManager</code> can test for this state.</li>
	 * <li>A {@link LockedException} must be thrown if an account is locked and the
	 * <code>AuthenticationManager</code> can test for account locking.</li>
	 * <li>A {@link BadCredentialsException} must be thrown if incorrect credentials are
	 * presented. Whilst the above exceptions are optional, an
	 * <code>AuthenticationManager</code> must <B>always</B> test credentials.</li>
	 * </ul>
	 * Exceptions should be tested for and if applicable thrown in the order expressed
	 * above (i.e. if an account is disabled or locked, the authentication request is
	 * immediately rejected and the credentials testing process is not performed). This
	 * prevents credentials being tested against disabled or locked accounts.
	 *
	 * @param authentication the authentication request object
	 *
	 * @return a fully authenticated object including credentials
	 *
	 * @throws AuthenticationException if authentication fails
	 */
	Authentication authenticate(Authentication authentication)
			throws AuthenticationException;
}



그런데 제가 의문인 부분은

 interface는 클래스에서 상속받아서 구현 후 사용하는 것으로만 알았는데 클래스 내부에서 저렇게 선언하면 인터페이스를 가져오는건지? 아니면 다른 의미가 있는 건지 궁금합니다.

그리고 위 코드 아랫부분 auth 부분에서 인터페이스 내부 메소드를 사용한 것처럼 나와있는데 인터페이스에는 메소드 구현을 못하지 않나요? 

만약 구현이 가능하다고 하면 아래 코드 맨 밑 부분에 있는 메소드를 구현한 것 같은데 Authentication 이란 것도 인터페이스더라구요. 인터페이스형을 반환받는 메소드 구현이 가능한가요?


요약:

1. 클래스 내부에서 (인터페이스 변수) 시 변수에 할당되는 것이 무엇인지

2. 위 코드에서 인터페이스 내부에 메소드 구현이 되어있는건지

3. 인터페이스형 메소드 작성여부? 


ps. 열심히 찾아보았는데 평범한 자바문법 내용밖에 없어서 제가 무엇을 잘못 이해한 것인지 모르는 건지 잘 모르겠습니다. ㅠㅠ

제가 무지해서 질문이 이상하더라도 이해해주시면 감사하겠습니다. 혹시 설명이 귀찮으시면 키워드라도 알려주시면 감사하겠습니다.


0
  • 답변 2

  • 마사키군
    1k
    2020-09-10 16:09:44

    1. 저건 할당해주는 부분을 찾아봐야 해서 지금 답변 드리기는 좀 어렵겠네요. 스프링 설정을 살펴보시거나, 내부적으로 생성해서 할당해주는 부분을 직접 찾으셔야 합니다. 여하튼 스프링 설정으로 AuthenticationManager 인터페이스를 구현한 구현 클래스를 넘겨주는 부분이 있을 겁니다.

    2. 본문에 적인 코드만 봐서는 인터페이스 내부에 메소드 구현이 되어있지는 않은 것 같습니다.

    3. 자바 8 부터는 인터페이스에도 실제 구현된 메서드를 작성하는 것이 가능합니다. "자바8 인터페이스 디폴트 메서드"로 검색해보세요.

  • 도라지보다더덕
    240
    2020-09-10 16:51:49
    헛 감사합니다!
  • 로그인을 하시면 답변을 등록할 수 있습니다.