전체 글
-
equals를 재정의할 때는 반드시 hashCode도 재정의하라카테고리 없음 2023. 4. 19. 09:57
equals를 재정의할 때는 반드시 hashCode도 재정의하라 예전에 동등성과 동일성에 대해 설명한 적이 있었다. 아마도 비슷한 내용이지 않나 싶다. 그래도 책에 나와있으니 다시 한번 포스팅해보자 Object 클래스 명세에서 복사해 온 일반 규약이다. 프로그램 실행 중에 같은 객체의 hashCode를 여러 번 호출하는 경우, eqauls가 사용하는 정보들이 변경되지 않는다면, 언제나 동일한 정수가 반환되어야 하지만 프로그램이 종료 되어 다시 실행 할 경우에는 그럴필요 없다. equals 메서드가 같다고 판정 되면 hashCode도 같아야 한다. equals 메서드가 다르다면 hashCode는 같을 수도 다를 수도 있지만 hashtable의 성능 향상을 위해 다른게 낫다. 만약 hashcode를 재정의하..
-
spring security 권한 관리카테고리 없음 2023. 4. 19. 09:56
이번에 security의 동적 권한?에 대해 알아보자. 권한 관리를 정적으로 하지 않고 db에서 권한을 관리하는 거다. 예전에 시큐리티를 처음 했을때 낑낑거리던 그때가 생각난다. 시큐리티가 좋긴 하지만 어렵다. 아무튼 한번 보자. 물론 내가 틀릴 수도 있다. 대충 설계는 위와 같다.(hierarchy 구조는 일단 뺏다. 하드코딩) Authorities는 매핑 테이블이다. User와 role을 매핑 시킨다. 한 user가 여러개의 롤을 가질수 있으며 롤 역시 여러개의 유저에 할당 할 수 있다. RoleResouce도 마찬가지다. Resouces는 실제 url 정보를 가지고 있다. 실제 이 예제에선 url을 등록 하지만 패턴으로 해도 상관 없을 듯 하다. 실제 패턴이 낫다. url을 한개씩 관리하면 관리가 ..
-
equals를 재정의할 때는 일반 규약을 따르자카테고리 없음 2023. 4. 19. 09:56
이펙티브 자바! equals를 재정의할 때는 일반 규약을 따르자 equals 메서드는 재정의하기 쉬워 보이지만 실수할 여지가 많다. 만약 재정의 하지 않는다면 그 경우에는 자기 자신하고만 같다. 만약 아래 조건이 부합한다면 그래도 된다. 1. 각각의 객체가 고유하다. 2. 클래스에 논리적 동일성 검사 방법이 있건 없건 상관 없다. 3. 상위 클래스에서 재정의한 equals가 하위 클래스에서 사용하기에도 적합하다. 4. 클래스가 private 또는 packing-private선언 되고 equals메서드를 호출할 일이 없다. equals 메서드는 동치 관계를 구현한다. 1. 반사성 : null이 아닌 참조 x가 있을때 x.equals(x)는 true를 반환한다. 2. 대칭성 : null이 아닌 참조 x와 y..
-
@Lazy 와 @Primary카테고리 없음 2023. 4. 19. 09:56
이번에는 Lazy와 Primary에대해 알아보자 Lazy는 말 그대로 게으른 걸 뜻한다. 코드로 확인하자 public class BeanClass { } 위와 같은 코드가 있다고 가정하자 그리고 빈으로 등록하자 @Bean public BeanClass beanClass(){ System.out.println("register bean"); return new BeanClass(); } 그런후에 테스트를 해보자. @Test public void lazyTest(){ System.out.println("get bean before"); BeanClass bean = applicationContext.getBean(BeanClass.class); System.out.println(bean); } 그럼 결과는 ..
-
properties 대신 yaml 사용 해보자카테고리 없음 2023. 4. 19. 09:56
spring boot에는 yaml(야물?)을 사용할 수 있다. json 과 비슷한 형태로 편리한 문법을 갖고 있다. 우리는 classpath 에 application.yml 을 추가 하면 자동으로 boot가 스캔한다. test: db: localdb 우리는 다음과 같이 설정한다. 해당 클래스에 바인딩을 하자. @Configuration @ConfigurationProperties(prefix = "test") public class ServerProfiles { private String db; public String getDb() { return db; } public void setDb(String db) { this.db = db; } } 그리고 나서 테스트를 해보자 @Autowired priva..
-
쓸데없이 객체를 만들지 말자!카테고리 없음 2023. 4. 19. 09:56
이펙티브 자바! 불필요한 객체는 만들지 말라. 동일한 객체는 필요할 때마다 만드는 것보다 재사용하는 편이 낫다. 변경 불가능한 객체는 언제나 재사용할 수 있다. 우리는 절대로 피해야 할 극단적 예를 들어보겠다. String s = new String("hello string"); 위의 코드는 쓸데 없는 짓이다. 만약 위의 문장이 loop나 자주 호출되는 메서드 안에 있으면 쓸데 없는 객체가 수십만개 수백만게 만들어 질것이다. String s = "hello string"; 위와 같이 하면 같은 가상머신에서 실행되는 코드는 동일한 String을 재 사용한다. String을 객체로 생성해서 쓸데 없는 짓을 하지 말자! 다음 코드를 보자 class Person{ private final Date birthDa..
-
spring xml을 java config로카테고리 없음 2023. 4. 19. 09:56
요즘에는 spring boot가 대세라 xml로 설정할 일이 없다. 그래서 아직 xml을 쓰는 사람을 위해 java config 설정 법을 간략하게 해보겠다. 일단 첫 번째 부터 한번 보자 public class BeanClass1 { public String getName(){ return "hi youngjin"; } } 우리한테는 이런 클래스가 있다고 가정하자! xml로 빈을 등록하기 위해 우리는 이렇게 했다. 위와 같이 메타정보를 xml로 설정 할때 이다. 클래스를 빈으로 설정한다. 잘되나 테스트를 해보자 @Test public void springXmlConfig(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationCon..
-
private 생성자를 사용하자카테고리 없음 2023. 4. 19. 09:55
제목이 조금 이상하긴한데.. 모든 클래스에 해당되는 말은 당연히 아니다 우리가 흔히 쓰는 유틸 클래스 상태가 없는 클래스들을 말하는거다. 해당 클래스들은 모두 static 메소드를 이루어져 있다. 객체를 인스턴스할 필요가 없는 클래스들 이다. 흔히 유틸 클래스를 만들 때 인스턴스화를 막기 위해 클래스의 abstract 선언하곤 한다. abstract 선언해도 인스턴스를 생성 할 수 있다. 예를 들어 보자 @Test public void test() { ReflectionClass reflectionClass = new ReflectionClass() { }; reflectionClass.printName("wonwoo"); } abstract class ReflectionClass { public Ref..