자바로 개발하는 프로젝트라면 Lombok을 많이 사용할것이다. 이런저런 규약에 따라 거의 필수적으로 만들어줘야하는 코드를 자동생성해주는 고마운 라이브러리이다. 객체 생성 패턴중 한가지인 빌더 클래스도 롬복의 @Builder 애노테이션을 이용하면 쉽게 만들 수 있다. @Builder public class Person { private int age; private String name; } 빌더 패턴에 대한 설명은 여기서 하지 않겠다(이전 포스팅). 롬복을 이용해 빌더 클래스를 만들면 이런식으로 Person 객체를 생성할 수 있다. Person person = Person.builder() .age(30) .name("LichKing") .build(); 이번에 포스팅할 내용은 이부분에 관한것이다. Pe..
현재 프로젝트 로그라이브러리로 log4j2를 사용하고있다. 그러다가 사용하게된 라이브러리가 있는데 이 라이브러리는 log4j 를 사용하고있었다. 의존성 전이에 따라 큰 문제없이 프로젝트 구동은 되지만 워닝 로그가 뜨게된다. log4j:WARN No appenders could be found for logger (org.apache.activemq.util.ThreadPoolUtils). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 이런로그가 뜨게되는데 무시해도 돌아가는덴 지장없지만... 없애보자. 1..
음..아마 2~3년전에 DI에 관한 포스팅을 하나 했던걸로 기억하는데 그때는 DI가 무엇인지에 대해 적었다면 이번엔 Spring이 어떤방식으로 DI를 해주는지 적어보려한다. 이 글을 적게된 계기는 가장 마지막에 소개할 생성자 주입 방식을 요근래에 알게됐기때문이다. 1. Field Injection가장 간단하고 코드량이 적고, 그때문에 가장 많은 분들이 이용하는 방식이 아닐까싶다. 3개 회사를 다녀봤지만 전부 필드 주입방식을 사용하고있었다. @Service class PersonService{ @Autowired private PersonRepository personRepository; } 이 방식은 가장 간단하고 편리하지만 스프링에 종속적이게된다는 단점이 있다. 뭐 사실 코드의 변경없이 기반 프레임워크..
바로 앞선 포스팅에서 Jackson 2.9 버전에 대해 알아봤다. 이 이슈를 해결하다가 알게된 버그인데 포스팅하고자한다. 1. 이슈 일단 앞선 이슈를 해결하기위해 Jackson 버전을 올렸는데 CI 서버가 테스트를 실행하면서 다른 곳의 테스트가 실패하는 이슈가 발생했다. json 문자열을 자바 객체로 역직렬화(deserialization)하는 테스트였는데 이런 코드였다. public class DeserializeTest { private ObjectMapper objectMapper; @Before public void setUp() { this.objectMapper = new ObjectMapper(); } @Test public void test() throws IOException { Strin..
json 문자열을 자바 객체로 역직렬화(deserialization)하거나 반대로 자바 객체를 json 문자열로 직렬화(serialization)을 할때 자바 라이브러리로는 대표적으로 jackson을 많이 사용한다. 직렬-역직렬시 json key를 결정하는건 @JsonProperty 라는 애노테이션을 이용한다. public class TestClass{ @JsonProperty("name") private String name; } TestClass 객체를 직렬화하거나 혹은 json 문자열을 TestClass 객체로 역직렬화시 name key는 @JsonProperty 애노테이션에 name으로 지정된 곳에 매핑이 되게된다. 참고로 해당 애노테이션이 없을때는 기본적으로 필드명끼리 매핑시키므로 예제와같이 필..
class 파일을 역어셈블리할때 사용하는 명령어 javap -c .class
EPL 팀의 리그순위 정보를 담고있는 객체를 만든다고 생각해보자. 보통 순위페이지에 나와있는 정보는 경기 수, 승점, 승, 무, 패, 득실차가 있다. 이 데이터들을 담는 클래스를 정의하자. class Team{ private String name; private int playCount; private int victoryPoint; private int winCount; private int drawCount; private int loseCount; private int scorePoint; } 이 객체를 생성하고, 필드들을 주입해줘야한다. 간단하게 setter를 만들어서 주입할 수 있다. Team team = new Team(); team.setName("맨유"); team.setPlayCount(..
이전에 올렸던 포스팅중에 Custom Serializer, Deserializer 만들기 가 있었다. 작성해놓고 나 스스로도 자주 다시보며 유용하게 써먹었던 포스팅인데 이번에 한가지 추가적인 경우를 맞이했다. 해당 필드에 특정 애노테이션이 달려있으면 기본 Serializer 를 사용하고, 없을 경우엔 CustomSerializer 를 사용 이라는 경우였다. 일단 애노테이션이 붙었는지를 먼저 검사해야하는데 그럴땐 리플렉션을 쓸수밖에 없었다. 그런데 직렬화를 할때마다 리플렉션을 사용하는건 비용이 좀 크지않나 라는 생각이 들었다. 그리고 분명히 이런 고민을 전세계에서 꽤 많이 했을 것 같은데 너무 원시적으로 문제를 해결하려는게 아닌가 라는 생각에 이리저리 검색을 좀 해봤다. 역시 이런고민은 이미 수많은 지구인..
자바7에서 추가된 Objects 클래스는 여러 유틸메서드를 제공하고있다. 이중 유용한 메서드들을 몇가지 알아보자. 1. equals()null에 대한 방어를 위해 이런코드를 작성한적이 한번쯤 있을것이다. public void method(String str1, String str2){ if(str1 != null && str1.equals(str2)){ } } str2는 인자로 활용되기때문에 null 체크를 굳이 할필요가 없지만 메서드 호출 객체인 str1이 null 이면 NPE가 발생하기때문에 이런식으로 방어코드를 작성하게된다. 이런 코드는 실무에서도 흔히 볼 수 있는데 null 체크는 자칫하면 빼먹기 쉬워 골칫덩이가 되곤한다. Optional로 우아하게 처리하는 방법도 있지만 str1과 str2가 모..
JPQL 작성 후 파라미터를 매핑하는 방법은 인덱스에 기반한 방법과 이름에 기반한 방법이 있다. 1. 인덱스 매핑@Query("SELECT e FROM Expense e WHERE e.id = ?1") List findById(Long id); spring-data-jpa 를 사용시 id를 이용해 조회하는 쿼리를 자동 생성해주므로 저런식으로 JPQL을 만들필요는 없지만 예제코드임을 기억하자. 이런식으로 인덱스를 사용할 수 있으며 인덱스는 1부터 시작한다. 2번째 파라미터의 경우 ?2 로 매핑해주면 된다. 2. 이름 매핑@Query("SELECT e FROM Expense e WHERE e.id = :#{#id}") List findById(@Param("id") Long id); 이름 기반 매핑의 경우 ..
- Total
- Today
- Yesterday
- db
- 정규표현식
- http
- DesignPattern
- OOP
- go-core
- frontcode
- MySQL
- Design Pattern
- javascript
- Jackson
- java
- backend개발환경
- JPA
- programming
- spring cloud
- Spring
- Kotlin
- java8
- code
- frontend개발환경
- JavaScript Core
- servlet
- TEST
- Git
- toby
- generics
- clean code
- mariadb
- EffectiveJava
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |