이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것이 일부 존재합니다.
/*
엔티티 클래스에서
EqualsAndHashCode로 id만 뺀 이유?
연관관계가 복잡해질 때
EqualsAndHashCode에서 서로 다른 연관관계를 계속해서 순환 참조하느라
무한루프가 발생하고, 스택오버플로우가 발생할 수 있음
*/
@EqualsAndHashCode(of = "id")
Reference
varchar : (풀네임)variable character, (콩글리쉬)버라이어블 캐릭터
라고 나는 읽을 것 같다.
바차~r 라고 하기엔 char를 "차"라고 읽지 않고 "캐릭터"라고 읽는 나의 습관이 있어 의심이 들었다. 혹여 버라이어블 캐릭터가 아니고 원래 이름이 있다면 말씀해주시면 감사드리겠습니다.
Reference(사실 커뮤니티에서 찾은 거라 정확하진 않습니다.)
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
<a class="nav-link" href="#" th:href="@{/login}">로그인</a>
위의 href
와 th:href
가 동시에 있으면, Thymeleaf가 랜더링할 때는 th:href를, Thymeleaf가 없으면 href로 적용됨
즉, 프론트엔드 개발자가 봤을 때는 href로 보여진다. 이는 프론트엔드 개발자로 하여금 프론트 부분의 유지보수를 용이하게 할 수 있다.
Java코드와 HTML코드가 섞여있는 JSP와는 달리 Thymeleaf는 작동하지 않을 때 순수 HTML코드만 볼 수 있게 해준다.
Reference
<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
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
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