Java3 특정 어노테이션이 추가된 자식 클래스를 찾으려고 할 때, 반드시 @Inherit를 사용하자 @Inherited는 어노테이션이 클래스에 적용될 때 해당 어노테이션이 하위 클래스에 상속될 수 있도록 한다. 기본적으로 어노테이션은 상속되지 않지만, @Inherited를 사용하면 부모 클래스에 적용된 어노테이션이 자식 클래스에도 적용된다. @Inherited 어노테이션이 없는 경우, (1) 인터페이스를 상속받은 구현체 또는 (2) 자식 클래스에서 해당 어노테이션이 추가되어 있는 클래스를 찾을 수 없게 된다. 이를 확인하기 위해 Spring의 ApplicationContext를 사용하여 어노테이션을 찾는 예제로 확인해 본다.1. @Inherited 없는 커스텀 어노테이션 정의@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@interface S.. 2024. 8. 27. MariaDB decimal 타입과 Java BigDecimal 동일하게 처리하기 😂 배경 정확한 실수 값 계산이 필요해 Java의 BigDecimal을 사용해 구현한 특정 비즈니스 로직이 있었다. 해당 로직은 조회 기능이 두 가지가 있는데, 하나는 DB 값을 조회하는 현재 조회, 다른 하나는 미래 날짜를 선택하면 예상된 값을 계산해서 보여주는 미래 조회가 있다. 어느 날 기획자가 해당 비즈니스 로직과 관련된 화면을 캡처해서 보여주며, 조회와 계산된 값이 맞지 않는다고 하며 의문을 제기했다. 해당 문제를 해결하고 나서 알게 된 부분에 대해서 공유하고자 한다. 🔎 문제 현재 조회(DB 조회)를 하면 100.0 값이 출력되고, 미래 날짜를 입력하고 계산해서 조회하면 99.9가 뜨는 문제가 발생했다. 해당 문제는 100을 3으로 나누는 경우 발생했는데, 100을 3으로 나누면 33.3333.. 2023. 8. 5. ObjectMapper readValue 다형성 적용하기 (+ Jackson2JsonRedisSerializer) 😵 배경 ObjectMapper의 readValue(InputStream in, Class valueType)를 사용하기 위해서는 Class가 필요하다. 일반적인 경우 구체적인 POJO 클래스 타입을 명시해서 사용하면 된다. 하지만 Bean으로 등록한 RestTeamplte에 Jackson2JsonRedisSerializer를 추가하는 것처럼 클래스 타입을 초기 설정한 이후 변경이 어려운 경우, 인터페이스 또는 추상 클래스를 활용한 다형성이 필요할 수 있다. 이런 경우 일반적인 상속 방식으로는 적용되지 않으며 별도의 설정이 필요하다. 해당 방법에 대해서 알아보자. 1. 하나의 구현체만 있는 경우 오직 하나의 구현체만 있는 경우, @JsonDeserialze 어노테이션을 통해서 Jackson에게 역직렬화 .. 2023. 7. 16. 이전 1 다음