과제 중 사용했던 개념과 어노테이션 사용법 이해

송수용·2022년 6월 18일
0

백엔드의 기술

목록 보기
11/11

과제 중 사용했던 개념들의 정리정리2
로 대신! ㅠㅠ

어노테이션

정말 몰랐던 어노테이션을 많이 알게되었고, 어떻게 쓰이는지 이해하게 된 시간이었던 것 같습니다.
처음에 고민했던 많은 것들을 제쳐두고 구현에 집중하고자 일단은 구글링 또는 찾은 자료들을
무작정 때려놓고 시작해서 디버깅하여 프로젝트를 구현해나가면서 과제를 해나아갔습니다.

물론 100% 이해했다고 확신할 수는 없지만, 계속 활용하다보면 이해할 수 있지 않을까 생각하고 있어요.

@JsonIgnore

@JsonIgnore, @JsonIgnoreProperties, @JsonIgnoreType 이러한 주석은 JSON 직렬화, 역직렬화에서
속성을 무시하는데 사용됩니다.

직렬화란??

객체의 직렬화는 객체의 내용을 바이트 단위로 변환하여
파일 또는 네트워크를 통해서 스트림(송수신)이 가능하도록 하는 것을 의미한다.

@JsonIgnore 어노테이션은 클래스의 속성(필드, 멤버변수) 수준에서 사용되고
@JsonIgnore는 직렬화 역직렬화에 사용되는 논리적 프로퍼티(속성) 값을 무시할때 사용됩니다.
@JsonIgnore 어노테이션은 @JsonProperty와 함께 사용될 수 있습니다.(명시적 선언 그리고 JSON에서 선언된 키값을 맵핑시킴)

@ManyToOne(fetch = FetchType.LAZY)

다대일 연관관계에서 지연로딩을 사용하여 연관관계를 만들어주었습니다.
지연로딩과 즉시로딩에 대한 개념을 정리해둔 내용을 블로그에 작성해두었습니다.
김영한님의 강의에서는 실무에서는 즉시로딩보단 지연로딩으로 최초에 코드를 깔아두고
작업을 해야한다고 하시더라고요.

Spring 자주 사용하는 유효성 검사 어노테이션

이번에 JWT그리고 유효성 검사, 예외처리 해보지 않은 것들을 챌린지해본다고 진짜 뇌절하고 싶었던 순간이 한 두번이 아니었는데요.. 그만큼 힘들었던 한 주였습니다.
이해하기가 정말 어려웠어요..

@NotNull

변수가 Null이 될 수 없다.

@NotEmpty

빈 값("")이 될 수 없다.

@NotBlank

trim했을때 Empty이면 안된다.
공백(" ")만 있는 문자열을 받지 못한다.

@Valid

유효성 검사 트리거.

@PostMapping("/")
public void Test(@Valid @RequestBody User user) {
	.....
}

보통 @RequestBody 앞에 붙여 사용할 수 있습니다!
여기서 나온 에러를 @ControllerAdvice에서 잡아서 처리해주면 됩니다.!

예외처리

예외처리를 위한 방법모색 (구글링)
기존에 알고 있던 try catch문을 사용하는 방법
@ExceptionHandler 를 사용하여 컨트롤러 내에서 발생하는 예외를 처리하는 방법
컨트롤러가 늘어나는 경우 중복코드가 발생(유지보수가 힘들어짐)
전역에서 예외 처리를 하기 위해 @ControllerAdvice 또는 @RestControllerAdvice를 쓴다.
이 어노테이션은 [[AOP(Aspect Oriented Programming)]의 방식이고, Application 전역에 발생하는 모든 컨트롤러의 예외를 한 곳에서 관리할 수 있게 해준다.

github Issuess에 과제 제출할 때 작성을 했었는데.. 다른 내용도 있으니
참고해보시면 좋을 것 같습니다.

알고 있던 다른 내용들을 챌린지해볼 수 있는 좋은 기회였다고 생각하고, 활용해서 적용해보라는 매니저님들의 의도와는 다르게 생각만큼 정말 잘되지 않았던 부분이었습니다.

더 열심히 공부를 해야될 것 같아요 ㅠ

의존성 주입

@Autowired

@Service
public class UseService {

   @Autowired
   private UseDao dao;
   
   @Autowired
   private UseResourceService resource;

@Autowired를 활용한 의존성 주입을 필드 주입이라고 하는데. 이 방식은 인텔리제이나, 스프링 팀에서 권장하지 않는다고 하더라고요!

그래서 사용하는 것이

@RequiredArgsConstructor

@Service
@RequiredArgsConstructor
public class UseService {

   private final UseDao dao;
  
   private final UseResourceService resource;

Lombok에서 지원하는 @RequiredArgsConstructor 어노테이션을 사용하여 의존성을 주입 하는 것을 생성자 주입이라고 하는데 이 방법을 권장합니다.

생성자 주입을 사용할 경우 아래와 같은 장점이 있다.

  1. 순환 참조 방지
  2. 테스트 코드 작성 편리
  3. 코드의 가독성
  4. 객체 변이 방지 (final 가능)

@Builder

@Bulider 어노테이션은 매우 낯설게 느껴졌었는데, 미용실에서 유튜브보다가 조금 이해한 정도..?

그도 그럴 것이 @Bulider 라는 어노테이션으로 쓰이고 빌더 패턴이라고도 부른다는데
이게 뭔가 패턴이라는 글자가 들어가면 싱글톤 패턴, 프록시패턴, 어댑터 패턴 데코레이터 패턴 전략패턴 등등.. 많은 디자인패턴들이 있는데 머리가 깨져머릴 것 같은 내용들이라 걱정했는데,
막상 강연이나 기술내용의 세션 주제로 발표하는 여러 매체, 그리고 기관들의 발표자들의 말을 들어보면 그래도 머리에 조금은 그려지는 게 있더라고요.

Builder Pattern의 장점

ref 에서 자세한 내용들이 있습니다!

  1. 필요한 데이터만 설정할 수 있음
  2. 유연성을 확보할 수 있음
  3. 가독성을 높일 수 있음
  4. 변경 가능성을 최소화할 수 있음

예외적인 경우

  1. 객체의 생성을 라이브러리로 위임하는 경우
  2. 변수의 개수가 2개 이하이며, 변경 가능성이 없는 경우

@EnableWebSecurity

WebSecurityConfigurerAdapter를 상속받은 config 클래스에 @EnableWebSecurity 어노테이션을 달면SpringSecurityFilterChain이 자동으로 포함됩니다.

그러나 프로젝트 중 동기가 공유해준 내용 중
공식 홈페이지를 보면, spring security 5.7이상에서 더 이상 WebSecurityConfigurerAdapter 사용을 권장하지 않는다고 하더라고요!

그래서 이를 해결하기 위해서 @Bean을 사용할 수 있었습니다.
ref

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            .httpBasic().disable() 
            .csrf().disable() 
            .cors().configurationSource(corsConfigurationSource()).and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
            .and()
            .authorizeRequests() 
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasRole("USER")
            .anyRequest().permitAll() 
            .and()
            .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider),
                    UsernamePasswordAuthenticationFilter.class);
    
    return http.build();
  }

}

내용이 더 있는데..(2편)으로 나누어볼게요..ㅠ

결국 이펙티브 자바 사버림..

profile
#공부중 #협업 #소통중시 #백엔드개발자 #능동적 #워커홀릭 #스파르타코딩 #항해99 #미니튜터 #Nudge #ENTJ #브레인스토밍 #아이디어뱅크

0개의 댓글