"java.nio.file.Files#delete" 사용을 권장합니다.

java.io.File#delete가 실패하면 메소드는 원인을 따로 표기하지 않고 false만 반환합니다. 반면 java.nio.file는 더 괜찮은 정보를 제공합니다. java.nio.file.Files#delete은 반환 타입이 void이지만 실패의 원인을 더 잘 보여주기 위해 exception을 던집니다. 그리고 일반적으로 디버깅 상황에서는 더 많은 정보가 있는게 훨씬 유리합니다. 따라서, java.nio.file.Files#delete을 사용하는 것이 더 좋습니다. 규칙을 어긴 코드 public void cleanUp(Path path) { File file = new File(path); if ...

더보기

메소드의 파라미터는 base 타입으로 지정되는게 좋습니다.

재사용성을 높이기 위해 메서드는 가능한 한 구체적이지 않은 매개 변수를 허용해야 합니다. 따라서 특정 기능 구현 요구가 덜한, 클래스 계층상의 상위에 있는 타입을 대신 사용하는 것이 좋습니다. 규칙을 어긴 코드 public void printSize(ArrayList<Object> list) { // Collection 을 사용하는 것이 더 낫습니다 System.out.println(list.size()); } public static void loop(List<Object> list) { // java.lang.Iterable 을 사용하는 것이 더 낫습니다 for (Obj...

더보기

"Cloneables"은 "clone"을 구현해야 합니다

단순히 Cloneable을 implements한다고 클래스를 클론할 수 있는게 아닙니다. Object.clone()을 오버라이딩 해주어야합니다. Cloneable 인터페이스의 clone 메소드를 어떻게 구현해야 하는지는 정해진 바가 없지만, 일반적으로 진정한 의미의 복제 가능성을 보장할 수 있도록 구현합니다. 그렇지 않으면 JVM clone이 사용됩니다. 기본 JVM clone은 원본 객체에서 primitive타입 값을 복사하고, 원본 객체가 객체를 갖는 경우 객체 참조를 복사하는 clone 을 의미합니다. 즉 JVM clone이 사용될 경우, 복제된 인스턴스들과 원본 인스턴스가 멤버 객체를 참조 공유할 수 있습니...

더보기

스프링 빈들은 "@ComponentScan" 에 의해 고려되어야합니다.

@ComponentScan 설정에 포함되지 않은 패키지에 속한 스프링 빈들은 스프링 애플리케이션 컨텍스트에서 접근할 수 없습니다. 그러므로, 이 룰에 의해 감지되는 경우 설정에 실수가 있을 수 있습니다. 참고: @ComponentScan 어노테이션은 @SpringBootApplication 어노테이션에 포함되어있으며, 이 경우 스프링 부트는 스프링 부트 메인 클래스를 포함한 하위 패키지들을 자동으로 스캔합니다. 규칙을 어긴 코드 package com.mycompany.app; @Configuration @ComponentScan("com.mycompany.app.beans") public class Appl...

더보기

스프링 "@Controller" 클래스들은 "@Scope" 를 사용하지 않아야 합니다.

스프링의 @Component, @Controller, @Service 그리고 @Repository 클래스들은 기본적으로 애플리케이션에서 하나만 인스턴스화 되는 싱글톤 객체입니다. 이러한 클래스들에 다른 Scope 을 정의하게되면, 새 인스턴스가 생성되고 제거될 때 불필요한 변동이 발생합니다. 샤용량이 많은 웹 애플리케이션에서, 이것은 많은 불필요한 서버의 부하를 추가로 일으킬 수 있습니다. 이 룰은 @Scope 어노테이션이 “singleton” 이외의 값으로 @Component, @Controller, @Service 또는 @Repository 에 적용될 때 문제를 제기합니다. @Scope("singleton")...

더보기

스프링 컴포넌트의 변수들은 주입되어야합니다.

스프링의 @Component, @Controller, @Service 그리고 @Repository 클래스들은 기본적으로 애플리케이션에서 하나만 인스턴스화 되는 싱글톤 객체입니다. 일반적으로 이러한 클래스들은 logger와 같은 적은 수의 static 멤버 변수들을 가질 수 있지만, 모든 non-static 멤버 변수들은 스프링에 의해 관리되어야 합니다. 즉, 이러한 변수들은 @Resource, @Inject, @Autowired @Value 와 같은 종류의 어노테이션이 달려있어야 합니다. 이러한 클래스들에 주입되지 않은 멤버 변수를 가지는 것은 상태를 변경하려는 시도를 나타낼 수 있습니다. 그들은 싱글톤 객체이기...

더보기

Private 생성자 밖에 없는 클래스는 final로 선언되어야 합니다.

Private 생성자 밖에 없는 클래스는 잘못된 상속이 발생하는 것을 막기위해 final로 선언되는 것이 낫습니다. 규칙을 어긴 코드 public class PrivateConstructorClass { // 규칙을 어긴 코드 private PrivateConstructorClass() { // ... } public static int magic(){ return 42; } } 규칙을 준수한 해결책 public final class PrivateConstructorClass { // 규칙을 준수한 해결책 private PrivateConstructorClass() {...

더보기

Public 메소드의 파라미터에 구현을 선택하는 전달인자(selector argument)가 들어가면 안됩니다.

메소드를 실행할 때 분기되는 두 개의 경로 중 어떤 경로를 선택할지 알려주는 boolean 전달인자를 보고 selector argument라고 부릅니다. 이러한 전달인자는 이름만 잘 짓는다면 꽤나 그럴 듯 하게 보일 수 있습니다. 하지만 안타깝게도 코드를 호출하는 사람 입장에선 이 파라미터의 이름을 볼 수 있는 방법이 없습니다. 그래서 이 전달인자가 메소드상에서 무슨 의미를 갖는지 확인하기 위해 시간을 더 들이게 만듭니다. selector argument를 사용하는 대신 메소드를 분리해서 작성해야 합니다. 이 규칙은 메소드가 통과하는 경로를 결정하는 데 사용되는 boolean argument가 있는지 확인하여...

더보기