[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()){ }
- 버그의 70~80% :
@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. 악용하는 링크
- CSRF : 사이트간 요청 위조 Cross-Site request forgery
- 세번 이상 쓰이면 상수 선언하여 사용하기
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를 써도 됨
- jpa에서는 find로 시작하는 것만 있는 경우 사용하기
- <?> 와일드카드 사용 지양
- 어떤 객체 타입이 들어가는지 제대로 명시해주는 것이 좋음
//전
public ResponseEntity<?> 뭐시기메소드(){}
//후
public ResponseEntity<뭐어시기> 뭐시기메소드(){}
댓글남기기