이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것이 일부 존재합니다.

1. @EqualsAndHashCode(of = "id")

/* 
	엔티티 클래스에서
	EqualsAndHashCode로 id만 뺀 이유?
    
	연관관계가 복잡해질 때 
    EqualsAndHashCode에서 서로 다른 연관관계를 계속해서 순환 참조하느라 
    무한루프가 발생하고, 스택오버플로우가 발생할 수 있음
*/
@EqualsAndHashCode(of = "id") 

Reference

2. varchar 어떻게 읽을까?

varchar : (풀네임)variable character, (콩글리쉬)버라이어블 캐릭터
라고 나는 읽을 것 같다.

바차~r 라고 하기엔 char를 "차"라고 읽지 않고 "캐릭터"라고 읽는 나의 습관이 있어 의심이 들었다. 혹여 버라이어블 캐릭터가 아니고 원래 이름이 있다면 말씀해주시면 감사드리겠습니다.

Reference(사실 커뮤니티에서 찾은 거라 정확하진 않습니다.)

3. WebSecurityConfigurerAdapter deprecated와 그의 해결방안

Spring Security 5.7.0-M2 버전 (22년 2월 21일) 이후로 Spring Security에서 WebSecurityConfigurerAdapter라는 security config에 쓰이는 클래스가 컴포넌트 기반의 보안 설정을 권장한다는 이유로 deprecated 되었다.

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
    }

}

이렇게 쓰이던 WebSecurityConfigurerAdapter클래스는 이제 못 쓰고 SecurityFilterChain인터페이스를 써야 한다. 다만, 따로 구현할 필요 없이 @Bean으로 Ioc Container에다가 빈을 등록한 메서드 안에서 구현한다.

configure(HttpSecurity http)메서드는 void가 반환형이었지만, 이번 filterChain(HttpSecurity http)메서드는 SecurityFilterChain이 반환형이다. 별 거 없고 http.build()로 만들어준 것을 리턴하면 된다.

@Configuration
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }

}

시큐리티 검증을 무시하는 설정 메서드를 작성할 때도

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/ignore1", "/ignore2");
    }

}

가 아닌

@Configuration
public class SecurityConfiguration {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
    }

}

이렇게 작성해야 한다. 화살표가 나오는 걸 보면 stream을 쓰는 것 같기도 하고, stream도 열심히 공부해야 겠다는 생각이 든다.

Reference

4. Thymeleaf의 전처리

<a class="nav-link" href="#" th:href="@{/login}">로그인</a>

위의 hrefth:href가 동시에 있으면, Thymeleaf가 랜더링할 때는 th:href를, Thymeleaf가 없으면 href로 적용됨

즉, 프론트엔드 개발자가 봤을 때는 href로 보여진다. 이는 프론트엔드 개발자로 하여금 프론트 부분의 유지보수를 용이하게 할 수 있다.
Java코드와 HTML코드가 섞여있는 JSP와는 달리 Thymeleaf는 작동하지 않을 때 순수 HTML코드만 볼 수 있게 해준다.

Reference

5. Thymeleaf의 인스턴스, 프로퍼티, 필드

<form th:object="${signUpForm}" method="post">
    <input id="nickname" type="text" th:field="*{nickname}" class="form-control">
</form>

th에 signUpForm이라는 객체를 제공하면, 이 객체를 form tag를 채우는 객체로 사용한다.
그리고 form 안에서 객체가 들고있는 프로퍼티들, nickname을 * 을 사용해서 참조할 수 있다.

즉, signUpForm이라는 인스턴스 안에 nickname이라는 프로퍼티를 input tag의 필드로 쓰는 것이다.

field로 쓴다는 것은 value를 프로퍼티의 값으로 쓰고, 이 input의 파라미터인 name도 nickname으로 쓰는 것이다.
nickname이 input tag의 name이자 nickname에 해당하는 value가 input의 값이 되는 것이다.

Reference

6. model 객체를 만들 때 생략이 가능한 경우

Model 인터페이스를 통해 Controller로 빈 model 객체를 넘길 때는 보통 이렇게 넘길 것이다.

@GetMapping("/sign-up")
public String signUpPage(Model model) {
    model.addAttribute("signUpForm", new SignUpForm());
    return "account/sign-up";
}

이때 new SignUpForm()로 객체를 하나 생성해서 첫 번째 인자인 "signUpForm"에다가 집어넣으면 모델 객체 하나가 완성된다.
잘 보면 클래스(타입)의 이름과 model 객체의 이름이 같다. 이럴 때 첫 번째 인자인 "signUpForm"을 생략할 수 있다.

만약, 객체 타입의 camelCase와 "첫 번째 인자의 이름"이 같다면 첫 번째 인자를 생략하고 attribute의 인자에 클래스가 생성한 객체의 타입만 넣어도 된다.
즉, 객체 타입의 camelCase가 자동으로 첫 번째 인자의 이름이 되는 것이다. 굳이 이름을 안 써도 되는 것이다.

Reference

7. 파라미터와 매개변수의 차이

Note: Parameters refers to the list of variables in a method declaration. Arguments are the actual values that are passed in when the method is invoked.
When you invoke a method, the arguments used must match the declaration's parameters in type and order.

매개변수(Parameter, 인자)는 메서드 선언의 변수 목록을 나타낸다. 인수(Arguments)는 메서드가 호출될 때 전달되는 실제 값이다.
메서드를 호출할 때 사용되는 인수는 매개변수의 유형 및 순서와 일치해야 한다.

/** 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수 */
public int sum(int parameter1, int parameter2) { // Parameter, 인자, 매개변수
	// 이때 매개변수는 값 전달 방식이 사용됨(참조 전달 방식 아님)
	return parameter1 + parameter2;
}

/** 함수가 호출될 때 함수로 값을 전달해주는 변수 */
sum(1,2); // Arguments, 인수

Reference

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee

0개의 댓글