본문 바로가기

분류 전체보기

(116)
인텔리제이에서 Lombok 적용이 안된다면 해결책 기본적으로 롬복 설치 및 인텔리제이 설정까지 끝냈음에도 롬복이 적용되지 않는 문제가 발생하곤 한다. 일단 순서에 맞게 진행을 했는지 확인해보자. 1. IntelliJ 플러그인에서 Lombok 플러그인이 Installed 상태인지, 더불어 활성화된 상태인지 확인하기 2. IntelliJ 설정에서 어노테이션 프로세서 - 어노테이션 처리 활성화 체크가 되어있는지 확인하기 3. pom.xml / build.gradle 의존성 관리자에 Lombok 의존성이 추가되었는지 확인 일반적으로 1 ~ 3을 진행하면 문제없이 진행되지만, Lombok을 의존성 프로세서로 설정되지 않았다면 설치 여부와 관계없이 사용할 수 없다. 따라서 다음과 같이 진행한다. 4. Lombok을 의존성 프로세서로 설정한다. annotationP..
싱글턴은 빈 스코프의 일부일 뿐이다. 스프링을 공부하다가, Scope 라는 빈의 라이프사이클에 대한 내용을 공부했는데 상당히 흥미로운 내용을 발견했다. 실제로 프로젝트를 진행하면 포틀릿 관련된 내용을 자주 접할 수 있었다. 도대체 이게 뭐시당가 라면서 고민했지만 하던대로 코딩해도 문제가 없었으니 넘어갔던 기억이 난다. 하지만 여기서 이걸 볼 줄이야... 내용은 다음과 같다. 0. Scope 정의는 기본적으로 Bean 생성 및 소멸을 어떻게 할 것인가? 그것에 대한 정의라고 볼 수 있다. 1. 스프링에서 Bean 정의를 할 때, 특정 목적에 맞도록 Scope 정의를 할 수 있다. 2. 싱글턴, 프로토타입 같은 기본적인 정의가 존재한다. 3. 웹에서 사용하는 Request, Session 또한 Bean Scope 일부다. 4. Global Se..
에러를 대처하는 것은 불가능하다. 단지 예외만 다룰 뿐이다. 자바에서는 오류의 종류로 Error, Exception 두 가지를 제안한다. 1. Error, 에러 Error는 간단하게, 하드웨어적인 문제가 발생하여 생기는 오류를 뜻한다. 당연히 개발자가 이를 해결할 방법은 없다. 컴퓨터가 불타고 박살나는데 정상적으로 소프트웨어가 돌아가게 하는 개발자가 있다면 이미 개발이라는 영역을 벗어난 초능력임이 확실하니까. 2. Exception, 예외 개발자가 작성한 코드가 의도치 않게 작동하여 발생하는 오류를 뜻한다. 이는 개발자가 반드시 고려해야 하는 영역이다. 3. 컴파일러 컴파일러가 감지할 수 있는 예외를 Exception 이라고 부르며, 컴파일러가 감지할 수 없는 예외를 Runtime Exception 이라고 부른다. 컴파일러가 감지하느냐 마느냐의 기준은 무엇일까? ..
try-with-resources 간략하게 알아보기 try - with - resources 관련된 글을 읽으면서 너무 이해가 안되는 부분이 있었다. "자원을 해제하기 위하여..." 이 말이 마치 관용구처럼 사용되었다. 추상적인 표현이라고 본다. 정확하게 자원을 무엇을 뜻하는가? 해제를 한다는 것은 어떤 행동이 수반되는가? 이런 내용이 전혀 정의되어 있지 않았다. 그래서 그 부분만 알아봤고 명확한 답을 얻을 수 있었다. 1. 자원, resources 자바에 한정해서 말하자면 객체를 뜻한다. 객체... 자원이라고 말하다가 객체라고 말하니 의미가 명확해진다. 2. 해제 AutoCloseable 인터페이스의 close() 메소드를 구현한 메소드를 호출한다는 의미다. 보충 설명이 필요한데, 객체의 라이프 사이클에 대한 내용에 대한 이해가 필요하다. 객체의 라이프..
SI식 개발 프로세스 정리하기 ============================== * 윗선 1. 요구사항 확인 2. 화면설계서 작성 3. 조율 & 컨펌 ============================== * 개발자 1. 요구사항 확인 2. 화면 설계서 확인 3. 인터페이스 정의서 확인 3-1. 없다면 소스 파악하는 시간이 필요 ** 4. 개발서버가 존재하는 고객사인지 확인 ** 4-1. 개발서버가 존재하지 않으면 운영서버에서 어떻게 테스트를 진행할 수 있는지 검토 5. 서비스 구현 5-1. 서비스 테스트 6. 화면 구현 6-1. 서비스 호출 테스트 6-2. 실제로 의도한대로 작동하는지 확인 7. 소스 반영 8. 고객사에서 확인 9. 피드백 있다면 수용 후 5~6 단계 반복 10. 고객사에서 컨펌했다면 비용 청구 11. 받았다면..
다사다난한 프로젝트가 종료됐다 처음부터 거의 끝까지 간 프로젝트를 마무리지었다. 진짜, 많은 것을 배웠다. 기술적으로는 훌륭하다고 말하기 어렵지만 그래도 큰 틀에서는 있을 것은 다 있는 프로젝트였다. 1. CI/CD, 업무분담을 통한 다양한 업체와의 협력, 새로운 툴에 적응하는 방법, 즉각적으로 만들어쓰는 공통모듈. 2. 어렵지 않지만 왜 그렇게 오류가 많을 수밖에 없는 지 알게된 프론트엔드 작업. 3. NULL 체크를 INPUT만 아니라, DB로부터 받아온 출력물에도 해야한다는 점. 4. 완성도와 성과 사이에서의 줄다리기... (이게 정말 사람 피말린다.) 1년 전의 나보다 한 발 나아갔다고 확신한다. 왜냐? 1년 전에 내가 작성한 코드를 보고 욕하면서 "누가 대체 이따위로 짰냐"고 화내면서 깃이력을 찾아봤기 때문이다. (...) ..
개발환경은 반드시 알아둬야 한다 개발을 하다보면 반드시 개발환경 단계에 대해서 알아야만 한다. 그래야 남이 무슨 말을 하는지 이해를 할 수 있다... "김 개발자님. 개발 서버에서 개발자님이 담당하신 서비스가 정상적으로 작동하지 않아요!" "제 컴퓨터에서는 잘 되는데요?" ==> 여기서 동일한 코드를 가지고 한쪽은 잘되고, 한쪽은 안된다고 한다. 둘 다 옳은 말을 하고 있다. 단지, 개발자는 개발환경이 로컬일 뿐이고, 검수자는 개발서버, 혹은 테스팅 환경에서 검수한 것이다. 여기서 "나는 되는데 왜 안된다고 하는 거야!?" 라고 화를 내면 자신의 부족함을 내세우는 것 외에는 아무것도 아니다... 확실하게 알아두고 가자. 1. Local 작동환경을 개인 컴퓨터에 설치해서 고정된 환경 내에서 프로그램을 개발하는 경우다. 일단 하나의 프로그..
Join이 가장 기본적이고 핵심적인 문법이다 쿼리를 돌려봤는데 너무 느려서 머리를 싸매고 문제를 찾았다. 하지만 프론트, 백엔드 모두 작성된 것은 문제가 없었고... 도대체 문제가 무엇인지 몰라서 발광(?)에 가까운 심정으로 모니터만 뚫어져라 쳐다봤다. 문제는 생각보다 간단했다. 사용하는 테이블 중 한 테이블에 JOIN이 안 걸려있던 것이다. 수억 건에 달하는 데이터를 전부 호출하니 당연하게도 느릴 수밖에 없는 구조였다. 이때서야 JOIN의 중요성을 깨달았다. 다른 문법이야 옳고 그름이 쉽게 보이는데, 테이블 하나에 조인이 걸려있냐 안 걸렸냐 그것은 문법상 오류도 아니므로 돌려봐서 문제를 깨닫기도 어렵다. 실제로 돌려볼 때는 데이터가 없었으니 더 문제가 없다고 생각했다.
한글 인코딩 한글은 EUC-KR, UTF-8 인코딩 타입이 공존한다. 따라서 영어처럼 단순 ASCII 인코딩 타입이 아니므로 인코딩 타입 문제가 발생하면 까다롭다. 그래서 한글을 사용할 때 UTF-8 인코딩 타입으로 통일하는 것이 인코딩 타입 문제에서 자유로워지는 방법이다.
예외 처리 시, try - catch - if 대신 optional 사용해보기 MVC 패턴에서 BIZ 파트를 작성하다보면 try - catch - if 문을 많이 사용하게 된다. DB에서 받아온 NULL 값을 처리하기 위해서 try - catch 이후 if (abc == null || abc == "") 같은 구문을 사용하는 것이다. 이것을 Optional로 처리하면 어떨까? try { data = dao.selectSomething(); Optional opt = Optional.ofNullable(data) .orElseThrow(() -> CompanyException(CompanyConstans.ALL, new Object["itHing"])); } catch (Exception e) { throw new CompanyException(CompanyConstans.ERROR..