[Daily Contents] 코드리뷰


  • 정적분석 툴 : SonaQube
    • https://www.sonarqube.org
    • 버그, 취약점, 보안이슈 등 볼 수 있음
    • 버그 등급
      • Blocker - 서버 다운될 정도
      • Critical - 서버 다운 X, 기능 다운 X
      • Major - 서버 다운 X, 기능 다운 되지는 않으나 기능이 안됨
        • 배포가 안됨
        • 현업에서는 Major까지 처리를 해야 올림
  • NullPointerException

    • 버그의 70~80% : NullPointerException
    //전
    if(image != null){
      if(image.getContentType().startWith("image")){
      }
    }
    
    //후
    if(image != null && !image.getContentType()){
      if(image.getContentType().startWith("image")){
      }
    }
    
    //전
    Member follow = memberRepository.findById(followId).get();
    
    //후
    Optional<> aaa = memberRepository.findById(followId).get();
    if(aaa.isPresent()){
    }
    
  • @Transactional은 private에서 쓸 수 없고 public에서만 쓸 수 있음
  • 엔티티로 받으면 안됨
    • DB에 들어가는 값이 그대로 들어가기 때문에 외부에서 들어오는 값은 바로 set해주면 injection에 취약하기 때문에 vaildation 체크가 필요함
    • -> HashMap 사용 / Dto or Vo 사용
//전
public ReponseEntity<Void> 뭐시기(@PathVariable(value="뭐시기") 뭐시기 뭐시기, Member member){}

//후
public ReponseEntity<Void> 뭐시기(@PathVariable(value="뭐시기") 뭐시기 뭐시기,HashMap member){
String aaa = member.get("name").toString();
//꺼내와서 하나씩 set해주기
//or Dto나 VO로 담아와서 넣어주기
}
  • 보안이슈
    • CSRF : 사이트간 요청 위조 Cross-Site request forgery
      • http.csrf().disable() - 위험
      • ex. 악용하는 링크
  • 세번 이상 쓰이면 상수 선언하여 사용하기
System.out.println("SSAFY" + "I");
System.out.println("SSAFY" + "I LOVE");
System.out.println("SSAFY" + "I LOVE YOU");

////

String aa = "SSAFY";
System.out.println(aa + "I");
System.out.println(aa + "I LOVE");
System.out.println(aa + "I LOVE YOU");

// 최적화 되어있는 것은 아래
// 세번 이상 쓰이면 상수 선언하여 사용하기
// aa라는 메모리에 쓰임
// 위에는 같은 값에도 불구하고 메모리가 세번 쓰임
  • System.out.println 대신 slf4j나 log4j로 테스트하기
    • System으로 시작하는게 제일 느려서 시스템 자체가 굉장히 느려지기 때문에 지양하기
  • 객체선언을 하고 또 하는게 문제인 코드
// 전
Snow snow = new Snow.builder().maker(maker)...build();
snow.save(snow);

// 후
repo.save(Snow.builder().maker(maker)…build());
  • builder랑 new로 생성하는 것의 차이점
Snow snow = new Snow();
snow.setA(a);
snow.setB(b);

// 빌더랑 생성자로 선언하는 것과 차이는 복잡한 객체를 생성할 때, 개발자가 실수하지 않게 하는 역할과 가독성적인 부분에서 쓰는걸로 알고 있습니다.!
// new로 하면 순서도 그대로 해야하는데 혹시 실수하면 문제가 생김
//-> 빌더 지향
  • java8의 stream() 함수는 잘 알고 써야함
    • 초기값, 중간계산값, 결과값
    • 맨 마지막은 stream에는 결과에 해당하는 api가 꼭 있어야함
      • forEach Collect
      • 결과 없으면 중간값을 lazy함?
  • Transactional(readOnly = true)

    • jpa에서는 find로 시작하는 것만 있는 경우 사용하기
      • save나 update가 필요하면 @modify를 써도 됨
  • <?> 와일드카드 사용 지양
    • 어떤 객체 타입이 들어가는지 제대로 명시해주는 것이 좋음
//전
public ResponseEntity<?> 뭐시기메소드(){}

//후
public ResponseEntity<뭐어시기> 뭐시기메소드(){}

댓글남기기