종우의 삶 (전체 공개)

Market Project - 2 // Java 문법에 대한 고찰 (Stream, lambda) 본문

개발/Spring

Market Project - 2 // Java 문법에 대한 고찰 (Stream, lambda)

jonggae 2024. 2. 7. 13:03

뜬금없지만 java에 대한 내용이다

 

우리가 자주쓰는 stream, map에 대한 이야기를 적어보려 한다.

 

public String createToken(Authentication authentication) {
        String authorities = authentication.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority)
                .collect(Collectors.joining(","));

        long now = (new Date()).getTime();
        Date validity = new Date(now + this.tokenExpirationTime);

        return Jwts.builder()
                .setSubject(authentication.getName())
                .claim(AUTHORITIES_KEY, authorities)
                .signWith(key, SignatureAlgorithm.HS256)
                .setExpiration(validity)
                .compact();
    }

 

JWT 에 사용하는 토큰을 실제로 생성하는 메서드이다. 여기서 다른 것 보다 항상 신경쓰였던 

stream()과 함께 따라나오는 map()이 있었는데.. JAVA8 부터 추가된 다양한 기능들을 여기에서 살펴볼 수 있다.

 

스트림

우선 스트림은 배열이나 컬렉션을 사용할 때의 문제점들을 해결하기 위해 추가되었다. 배열이나 컬렉션에 저장된 데이터에 접근하려면 코드도 길어지고 반복문이나 반복자(iterator)를 사용하여 매번 새로운 코드를 작성해야했기 때문에...

 


(Authentication 객체 생성 코드)

더보기
 public Authentication getAuthentication(String token) {
        Claims claims = Jwts
                .parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody();

    Collection<? extends GrantedAuthority> authorities =
            Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(","))
                    .map(SimpleGrantedAuthority::new)
                    .collect(Collectors.toList());

        User principal = new User(claims.getSubject(),"",authorities);

        return new UsernamePasswordAuthenticationToken(principal, token, authorities);
    }

  String authorities = authentication.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority)
                .collect(Collectors.joining(","));

 

이 코드를 살펴보자. 

authentication.getAuthorities()Authentication 객체에서 권한 정보를 받아온다. 권한정보는 

Collection<GrantedAuthority> 형태의 콜렉션이므로 여러개의 권한 정보를 포함하고 있다. 

stream() 메서드는 이 정보들을 스트림으로 변환하여 자바 컬렉션을 함수형으로 다루게 한다.

 

map() 메서드는 스트림 내부의 한 메서드로, 스트림의 요소를 특정 함수에 적용하여 새로운 요소로 매핑하는 역할을 한다.

여기서는 GrantedAuthority 객체에서 권한 정보를 추출하기 위해 

GrantedAuthority::getAuthority 메서드 참조를 하여 가져온다. (람다 표현식 중 메서드 참조)

 

스트림의 요소들을 가져왔으므로 collect() 를 이용하여 새로운 컬렉션으로 만들어준다. 스트림의 요소들을  [ , ] 쉼표를 이용해 구분된 문자열로 합친다는 의미이다. 

이렇게 합쳐진 문자열들은 authority 변수에 저장이 될 것이다.

 

결국 ROLE_USER, ROLE_ADMIN 같은 권한을 가져와, 다시 컬렉션으로 만들어 사용할 수 있게 하는 과정이었다.

 

처음부터 람다, 스트림을 제대로 공부하지 않았어서 이해가 어렵긴했지만, 어느정도 이해를 할 수 있게 된 것 같다.

다른 부분에서 쓰이는 이러한 자바 문법들도 자세히 살펴보면 이해가 더 깊어질 듯 하다.

 

그렇다면 다시 프로젝트하러~

 

Comments