일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 링킹
- 클린코드
- 자바
- ORM
- String
- Kotlin for Java Developers
- JPA
- IOC
- Immutable
- 토비의스프링
- 토비의스프링3.1
- DesignPattern
- 링커
- hibernate
- ApplicationContext
- 빌드툴
- gradle
- 컴퓨터시스템
- Spring
- exception
- FunctionalInterfaces
- DispatcherServlet
- springwebmvc
- AutoConfiguration
- beanfactory
- springboot
- 메이븐
- java
- 프록시
- lambda
- Today
- Total
목록전체 글 (98)
엔지니어로 가는 길
* HttpMessageConverter가 무엇인지에 대해서는 다음 기회에 다루기로 한다. WebMvcConfigurer Spring은 `WebMvcConfigurer`라는 인터페이스를 통해 웹과 관련된 설정을 커스터마이징 할 수 있도록 돕는다. WebMvcConfigurer Defines callback methods to customize the Java-based configuration for Spring MVC enabled via @EnableWebMvc. @EnableWebMvc-annotated configuration classes may implement this interface to be called back and given a chance to customize the defau..
@EnableWebMvc - Spring에서 제공하는 어노테이션 - `@Configuration`이 붙은 자바 클래스 설정 파일에 사용될 수 있다 - 이 어노테이션이 붙을 경우 `WebMvcConfigurationSupport` 클래스로부터 Spring MVC 설정을 import 한다 (`HandlerMapping`, `HandlerAdapter`, `ConversionService` 등 웹과 관련된 빈들이 등록된다) @WebMvcAutoConfiguration - Spring Boot에서 제공하는 어노테이션 - 웹과 관련된 자동설정이 이루어진다 - spring-boot-starter-web 의존성을 추가하면 별도의 작업을 해주지 않아도 말 그대로 자동으로 설정된다 Spring Boot 자동설정과 관련해..
재능 있는 사람이란 개발과 관련된 지식 또는 능력을 다른 사람보다 빨리 습득하는 사람이라고 하고, 뛰어난 개발자를 다섯 손가락 안에 꼽히는 회사에서 일하는 개발자라고 가정한다면 재능 없는 사람도 뛰어난 개발자가 될 수 있다고 생각한다. 개발은 시험이나 대회가 아니다 정량적으로 점수를 매길 수도 없고, 참여자들을 변별하기 위해 누군가 억지로 만든 변별력 있는 문제를 풀어야 하는 것도 아니며, 언제나 정답이 정해져있는 것도 아니다. 개발은 현실의 문제를 해결하는 것이고, 때로는 효과적이고 효율적인 방식보다 빠른 방식이 정답일 때도 있고, 빠른 방식보다 효과적이고 효율적인 방식이 정답일 때도 있다. 따라서 좋은 회사는 개발자를 뽑을 때 정량적으로 점수를 매기는 것이 아니라 자신들이 정한 일정한 기준을 넘는 개..
Spring boot 버전을 올려보자 Spring boot 2.0을 사용 중인 프로젝트의 버전을 최신 버전으로 올려보려고 한다. 간단한 일은 아니겠지만 불가능한 일도 아니다. 수많은 문제를 끊임없이 만나게 될 텐데, 문제를 만나서 해결하거 live-everyday.tistory.com 담당하고 있는 프로젝트의 Spring Boot 버전을 2.0.1에서 2.7.6까지 올렸다. 위 글에서 Spring Boot 버전을 올려보고 싶다고 말하기는 했으나 이렇게 생각보다 빠르게 마무리될 줄은 몰랐다. 이 글에서는 Spring Boot 버전업 과정에서 만난 이슈를 정리하려고 한다. (버전을 올림에 따라 발생할 수 있는 모든 이슈가 아닌, 회사 프로젝트에서 발생한 이슈만 정리하였다.) 2.1.18 -> 2.2.13 A..
Table Of Contents 1. Nullable types 2. Nullable types under the hood 3. Safe casts 4. Importance of nullability 5. TMI 1. Nullable types The problem of nullability is sometimes referred to as billion dollar mistake. `NullPointerException` is really hard to fix. Modern approach: to make NPE compile-time error, not run-time error 코틀린은 nullable types과 non-nullable types을 구분한다. val s1: String = alwa..
커리어적으로 예리하고 긴장된 상태란 쉽게 말해서 언제든 이직할 수 있는 상태를 말한다. 언제나 가슴에 이직을 품고 있어야 한다는 뜻이 아니다. 지금 회사가 아주 마음에 들고, 가능하다면 지금 회사에서 커리어를 끝까지 보내고 싶다고 하더라도, 오히려 그럴수록 더욱 커리어적으로 예리하고 긴장된 상태를 유지하려고 노력해야 한다고 생각한다. 예리하고 긴장된 상태를 유지해야만 1. 끊임없이 성장할 수 있다 2. 이직하고 싶은/이직해야 하는 상황이 찾아왔을 때도 걱정이 없다 3. 회사와 나를 대등한 관계로 여기며 당당할 수 있다 무뎌지지 말자. 더 나의 상태를 더 예리하게 만들자. 긴장을 놓지말자. 나는 더 잘할 수 있고, 지금의 조건보다 더 좋은 조건, 지금의 회사보다 더 괜찮은 회사는 항상 존재하며, 나만 준비..
아플 때마다 하는 말이지만 역시 건강이 최고다. 3년 정도 잘 피해 다니다가 최근에 코로나에 걸렸는데 꽤 아팠다. 목이 화상 입은 것처럼 아파서 바나나도 삼키지 못했는데 지금은 많이 좋아졌다. 우리에게 건강은 일반적으로 아주 좋은 상태로 주어진다. 건강한 것을 당연하게 여기고, 앞으로도 계속 좋을 줄로만 알고 건강을 소홀히 여기기 시작하면 언젠가 반드시 대가를 치르게 되어있다. 건강을 소홀히 해서 코로나에 걸린 것은 아니지만, 코로나로 간만에 아파봤으니 건강의 중요성을 다시 한번 깨닫고, 경각심을 가지는 기회로 삼으려고 한다. 지금 건강한 건 절대 당연한 게 아니다. 감사해야 할 일이다. 앞으로의 건강 또한 그냥 보장되는 게 아니다. 노력해야만 건강할 확률을 높일 수 있을 뿐이다. 나중에 돌이킬 수 없을..
* 한 두 달 전쯤 진행했던 업무 빌드 타임 30분 담당하고 있는 서비스에서 의존성을 추가하거나 수정할 때마다 30분이 소요됐다. 처음엔 '원래 그런가 보다' 하고 넘어갔는데, 해당 서비스에 대해 알게 될수록 30분은 너무 과하다는 생각이 들었다. 의존성을 하나 추가하거나 수정하는 아주 간단한 수정이었고, 프로젝트도 그렇게 거대하고 복잡하지 않은 데 너무 오랜 시간이 걸린다고 생각했다. 그러던 차에 의존성을 수정할 일이 있는 업무를 맡게 되었고, 빌드 타임부터 개선해보기로 했다. 원인이 뭘까 해당 서비스는 gradle 멀티 모듈 프로젝트였고, gradle 버전은 4.X였다. 처음에는 build.gradle 파일을 보며 빌드 타임이 느린 원인을 몇 가지 추측해보았다. - deprecated 저장소 - 불필..
속 디미터 법칙에 대한 내용을 정리한 글이다. 디미터 법칙 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다. 구체적으로 예를 들자면 어떤 클래스 C의 메서드 M에서는 아래와 같은 메서드만 호출해야 한다. 클래스 C의 메서드 클래스 C의 인스턴스 변수로 저장된 객체의 메서드 메서드 M 안에서 생성한 객체의 메서드 메서드 M의 인자로 넘어온 객체의 메서드 아래의 코드를 살펴보자. ctxt.getOptions().getScratchDir().getAbsolutePath(); // 아파치 프레임워크 속 코드 만약 위의 코드에서 ctxt가 객체라면(자료 구조가 아니라) 이는 디미터 법칙을 어긴 것이다. 메서드 체이닝이 중요한 것이 아니다. 디미터 법칙을 어겼는지를 결정하는 요소는 ctxt, Opti..
Table of contents 1. Extension functions 2. 표준 라이브러리 속 확장 함수 3. Calling Extensions 4. 확장 함수가 중요한 이유 5. TMI Extension functions Extension functions Extension functions(이하 확장 함수)는 클래스 외부에서 정의되지만 클래스의 멤버 함수인 것처럼 사용할 수 있는 함수이다. // 확장 함수 정의 fun String.lastChar() = this.get(this.length - 1) // 확장 함수 사용하는 예시 val c: Char = "abc".lastChar() 위와 같이 `lastChar()`라는 extension 함수를 정의하면 `lastChar` 함수가 마치 String..