728x90
λ°˜μ‘ν˜•

ν•„λ“œ μ£Όμž… 방식(Field Injection)

 

: @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 클래슀의 멀버 λ³€μˆ˜μ— 직접 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” 방식

@Autowired
private JoinService joinService

 

μž₯점

1. κ°„νŽΈν•¨(ν•„λ“œ, μƒμ„±μž λ˜λŠ” λ©”μ„œλ“œμ— κ°„λ‹¨νžˆ λΆ™μ—¬μ„œ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•  수 μžˆλ‹€ /  μ½”λ“œκ°€ 짧고, 직관적이며 섀정이 κ°„λ‹¨ν•˜λ‹€)

2. μœ μ—°μ„±(ν•„λ“œ, μƒμ„±μž, μ„Έν„° λ©”μ„œλ“œ λ“± λ‹€μ–‘ν•œ μ£Όμž… 방법을 μ§€μ›ν•œλ‹€ / 클래슀의 ꡬ쑰에 따라 μ μ ˆν•œ μ£Όμž… 방식을 선택할 수 μžˆλ‹€)

 

μƒμ„±μž μ£Όμž… 방식(Constructor Injection)

 

: 클래슀의 μƒμ„±μžλ₯Ό 톡해 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ£Όμž…ν•  μ˜μ‘΄μ„±μ„ μƒμ„±μžμ˜ λ§€κ²Œλ³€μˆ˜λ‘œ λ°›λŠ”λ‹€...

private final JoinService joinService;

@Autowired
public YourClassName(JoinService joinService) {
    this.joinService = joinService;
}

 

 

근데 μ™œ... μƒμ„±μž μ£Όμž… 방식이 더 μ’‹μ„κΉŒμš”??

 

 

1.λΆˆλ³€μ„±(Immutability)

- ν•„λ“œ μ£Όμž… λ°©μ‹μ—μ„œλŠ” private ν•„λ“œκ°€ final일 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μƒμ„±μž μ£Όμž…μ„ μ‚¬μš©ν•˜λ©΄ μ£Όμž…λœ μ˜μ‘΄μ„±μ„ final둜 μ„ μ–Έν•  수 μžˆμ–΄ 객체의 λΆˆλ³€μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€

- μ΄λŠ” 객체가 μƒμ„±λœ ν›„ μ˜μ‘΄μ„±μ΄ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€

 

2. ν…ŒμŠ€νŠΈ μš©μ΄μ„±

- μƒμ„±μž μ£Όμž…μ€ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹œμ— 더 μ‰½μŠ΅λ‹ˆλ‹€. μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜κΈ° μœ„ν•΄ λ¦¬ν”Œλ ‰μ…˜μ΄λ‚˜ ν”„λ ˆμž„μ›Œν¬μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , λ‹¨μˆœνžˆ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ©΄λ©λ‹ˆλ‹€

- 이λ₯Ό 톡해 더 κΉ¨λ—ν•˜κ³  κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€

 

3. μˆœν™˜ μ˜μ‘΄μ„± 방지

- μƒμ„±μž μ£Όμž…μ€ μˆœν™˜ μ˜μ‘΄μ„±μ„ 컴파일 μ‹œμ μ— 감지할 수 있게 λ©λ‹ˆλ‹€. μ΄λŠ” μˆœν™˜ μ˜μ‘΄μ„±μ„ λ°©μ§€ν•˜κ³ , 더 λͺ…ν™•ν•œ μ˜μ‘΄μ„± ꡬ쑰λ₯Ό μœ μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.

- ν•„λ“œ μ£Όμž…μ΄λ‚˜ setter μ£Όμž… λ°©μ‹μ—μ„œλŠ” μˆœν™˜ μ˜μ‘΄μ„±μ„ λŸ°νƒ€μž„κΉŒμ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€

 

4. λͺ…μ‹œμ  μ˜μ‘΄μ„±

- μƒμ„±μž μ£Όμž…μ€ ν΄λž˜μŠ€κ°€ μ–΄λ–€ μ˜μ‘΄μ„±μ„ ν•„μš”λ‘œ ν•˜λŠ”μ§€ λͺ…μ‹œμ μœΌλ‘œ λ³΄μ—¬μ€λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μž…λ‹ˆλ‹€.

- 반면 ν•„λ“œ μ£Όμž… 방식은 μ˜μ‘΄μ„±μ„ 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ•Œ 수 μžˆμ–΄, μ˜μ‘΄μ„±μ„ μΆ”μ ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€

 

=> κ²°λ‘ 

@Authowired  μ–΄λ…Έν…Œμ΄μ…˜μ€ μ‚¬μš©μ΄ κ°„λ‹¨ν•˜κ³  μ§κ΄€μ μ΄μ–΄μ„œ 널리 μ‚¬μš©λ˜μ§€λ§Œ, ν•„λ“œ μ£Όμž… λ°©μ‹λ³΄λ‹€λŠ” μƒμ„±μž μ£Όμž… 방식을 ꢌμž₯ν•©λ‹ˆλ‹€. μƒμ„±μž μ£Όμž… 방식은 객체의 λΆˆλ³€μ„±μ„ 보μž₯ν•˜κ³  μ½”λ“œμ˜ λͺ…ν™•μ„±κ³Ό ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ 높이며, μˆœν™˜ μ˜μ‘΄μ„±μ„ λ°©μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜, μƒμ„±μž μ£Όμž… 방식이 더 많이 ꢌμž₯λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€

 

728x90
λ°˜μ‘ν˜•

'Spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Spring Security κ³΅λΆ€ν•˜κΈ° (1)  (0) 2024.05.20
728x90
λ°˜μ‘ν˜•

μ‹€μŠ΅ λͺ©ν‘œ 및 κ°„λ‹¨ν•œ λ™μž‘ 원리

 

μ‹€μŠ΅ λͺ©ν‘œ

: μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° ν”„λ ˆμž„μ›Œν¬λ₯Ό ν™œμš©ν•˜μ—¬ 인증, 인가λ₯Ό κ΅¬ν˜„ν•˜κ³  νšŒμ› 정보 μ €μž₯(μ˜μ†μ„±)은 MySQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν™œμš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€

 

κ΅¬ν˜„

- 인증 : 둜그인

- 인가 : κ²½λ‘œλ³„ μ ‘κ·Ό κΆŒν•œ

- νšŒμ›κ°€μž…

 

μ‹œνλ¦¬ν‹° λ™μž‘ 원리

κ°„λ‹¨νžˆ 정리해 보자면....

 

Spring Security ConfigλΌλŠ” filterλ₯Ό λ§Œλ“€μ–΄ λ†“μœΌλ©΄ client의 μš”μ²­μ„ κ°€λ‘œμ±„μ„œ clientκ°€ 가고싢은 λͺ©μ μ§€ 이전에 νŠΉμ •ν•œ κΆŒν•œμ„ 가지고 μžˆλŠ”μ§€ 뢄석을 ν•˜κ³  κΆŒν•œμ„ 확인을 ν•˜μ—¬ 막든지 ν—ˆμš©ν•˜λ“ μ§€ ν•©λ‹ˆλ‹€(μ„Έμ…˜μ— 둜그인 정보 냄김)

 

버전

- Spring Boot 3.1.5

- Security 6.1.5

- Spring Data JPA - MySQL

- mustache

- IntelliJ Ultimate

 

 

ν”„λ‘œμ νŠΈ 생성

 

μ˜μ‘΄μ„±

- Spring Web

- Lombok

- Mustache

- Spring Security

- Spring Data JPA

- MySQL Driver

 

 

main page

 

package com.example.testsecurity.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {

    @GetMapping("/")
    public String mainP() {

        return "main";
    }
}

 

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Main Page</title>
</head>
<body>
main page
</body>
</html>

 

아이디 : user / λΉ„λ°€λ²ˆν˜Έ : μΈν…”λ¦¬μ œμ΄μ—μ„œ μ€€κ±Έ λ“€μ–΄κ°€λ©΄ λ§Œλ“  화면을 λ³Ό 수 μžˆλ‹€!!

 

 

Security Config 클래슀

 

 

인가

 

νŠΉμ • κ²½λ‘œμ— μš”μ²­μ΄ 였면 Controller ν΄λž˜μŠ€μ— λ„λ‹¬ν•˜κΈ° μ „ ν•„ν„°μ—μ„œ Spring Securityκ°€ 검증을 함

 

1. ν•΄λ‹Ή 경둜의 접근은 λˆ„κ΅¬μ—κ²Œ μ—΄λ € μžˆλŠ”μ§€

2, 둜그인이 μ™„λ£Œλœ μ‚¬μš©μžμΈμ§€

3. ν•΄λ‹Ήλ˜λŠ” role을 가지고 μžˆλŠ”μ§€

 

 

μ‹œνλ¦¬ν‹° Config 클래슀 μž‘μ„±

 

package com.example.testsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{

        http
                .authorizeHttpRequests((auth) -> auth
                        .requestMatchers("/", "/login").permitAll() 		// permitAll() : λͺ¨λ‘ ν—ˆμš©
                        .requestMatchers("/admin").hasRole("ADMIN")			// hasRole() : ν•΄λ‹Ή 역할을 가진 μ‚¬μš©μžλ§Œ
                        .requestMatchers("/my/**").hasAnyRole("ADMIN", "USER") // hasAnyRole() : ν•΄λ‹Ή 역할듀을 가진 μ‚¬μš©μžλ“€λ§Œ
                        .anyRequest().authenticated()	// anyRequest() : 이외에 μ²˜λ¦¬ν•˜μ§€ λͺ»ν•œ λ‘œμ§λ“€ / authenticated : λ‘œκ·ΈμΈν•œ λͺ¨λ“  μ‚¬μš©μž
                );

        return http.build();
    }
}

 

상단 λΆ€ν„° λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μˆœμ„œμ— μœ μ˜ν•˜μ—¬ 적어야 ν•œλ‹€(밑에 μ½”λ“œλ“€μ΄ μ•ˆ 먹을 수 있음)

 

 

μΆ”κ°€ νŽ˜μ΄μ§€ 생성

 

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class AdminController {

    @GetMapping("/admin")
    public String admin() {

        return "admin";
    }
}

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>admin Page</title>
</head>
<body>
admin Page
</body>
</html>

 

admin νŽ˜μ΄μ§€μ— λ”°λ‘œ μ ‘κ·Όν•  수 μ—†μŒ... λ”°λ‘œ role을 μ„€μ •ν•΄ 주지 μ•Šμ•„μ†Œ... 

728x90
λ°˜μ‘ν˜•

+ Recent posts