분류 전체보기54 [개발자의 Git] 운영 브랜치 이관기 솔직히 말해서, 최근 회사 상황이 녹록지 않았다.최근 들어 새로운 기능 개발이나 수정사항도 없던 상황.IDC에 구축한 모든 서비스를 임대서버로 옮겨야 한다는 결정사항이 내려왔다.(이관하느라 바빠서 글 안 올린다고 변명하는 거 맞다.)데이터베이스 이관은 서비스 중단이 필수이기 때문에, 우선 소스를 먼저 이관하기로 결정했다.현재 상황GitLab 사용 중.3가지 종류의 브랜치(운영, 개발, 기능)를 운영.운영 (Master, 서비스되고 있는 코드)개발 (Development, 통합 테스트 코드)기능 / 이슈 (Feature / Hotfix, 개발자별 기능 개발 / 이슈 대응 코드)이관할 서버의 GitLab은 신규 설치 돼있음.기존 프로젝트와 동일하게 프로젝트도 생성 돼있음.이관 전략운영 브랜치만 옮기고, 다 .. 2025. 7. 29. [Gradle] 설정 파일 구조 완전 정복! 진짜 핵심적인 파일들의 구조를 한번 파헤쳐 보자. 내가 생각할때 핵심 설정 파일들은 아래 3가지다.gradle.propertiessettings.gradle.ktsbuild.gradle.kts실행 순서에 따라서 먼저 gradle.properties 부터 살펴보자!gradle.propertiesjavaVersion=21jacksonVersion=2.19.0junitVersion=5.13.3gradle.properties 파일은 전역으로 환경설정할 때 사용한다.여기서는 전역으로 사용할 버전의 정보들을 관리하고 있다.이렇게 해두면, 버전은 이곳에서 한 번에 관리할 수 있다.1 Line : JDK 버전2 Line : Jackson 라이브러리 버전3 Line : Junit버전이 파일에 버전들을 위와 같이 써 넣는.. 2025. 7. 15. [Gradle] Phase Gradle 빌드는 아래 이미지와 같이 3개의 Phase(단계)로 구성되어있다.1. 초기화 단계 (Initialization Phase)어떤 프로젝트(들)를 빌드할지 정하는 단계멀티 프로젝트의 경우 이 단계에서 모든 하위 프로젝트 인식함.settings.gradle.kts 실행settings.gradle.kts 파일에서 project 변수 사용 불가. (project 객체가 초기화 되기 전 시점)이 단계에서 사용 가능한 변수 / 사용 파일 위치gradle / settings.gradle.kts, build.gradle.ktssettings / settings.gradle.ktsrootProject / settings.gradle.kts (제한적 사용 가능.. 안된다고 이해하는게 좋을듯..)2. 설정 단계.. 2025. 7. 10. [Gradle] Gradle Task, 왜 이렇게 많고 헷갈리는 거야? Gradle 공식 사이트에서 Task LifeCycle을 보면 다음과 같다. compileJava, processResouces, jar, build, clean...너무 많은거 같은데. 이게 뭘 하는거지..? 위 Task LifeCycle 이미지에서 각각의 파란색 사각형들은 Task다. Gradle Task는 크게 "작업 태스크"와 "집계 태스크"로 분류 할수 있다.작업 태스크 (Action Task)compileJavaprocessResourcescompileTestJavaprocessTestResourcestestjarclean작업 태스크는 직접 일을 하는 Task다.Compile컴파일(compile) 접두사가 붙은 Task(compileJava, compileTestJava)들은 모두 "번역"이라.. 2025. 7. 9. [주절주절] 개발자의 기술 감각? "서버"가 아니라 "기능"을 띄우는 시대AWS를 학습할 목적으로 설정해 볼 기회가 있었다.익숙한 방식으로 접근했다.Spring Boot 애플리케이션을 EC2에 올리면 되는거 아냐? 조금 더 알아보니.. 생각이 바뀌기 시작했다..클라우드가 단순히 물리적인 (내가 직접 관리하는)서버 없이 인스턴스를 실행한다고만 생각했었는데AWS는 인증, 배치, 스케일링 등 기존 서버 애플리케이션 또는 인프라가 제공하는 기능들을 서비스로 제공하고 있었다.인증 -> Cognito배치 작업 -> Lambda/ Fargate / EC2더이상 "백엔드 = EC2 서버 1대"가 아님. 이런 맥락으로 기존에 서버 애플리케이션이 담당하던 일들을 클라우드가 지원해준다면,애플리케이션 개발은 점점 더 핵심 기능에 집중 할수 밖에 없겠다는 생.. 2025. 6. 19. [Gradle] groovy가 좋은거예요? kotlin이 좋은거예요? Gradle을 처음 쓸때는 Groovy 기반으로 Gradle DSL을 작성했었다. 지금은, 몇 가지 불편사항 때문에 Kotlin 기반 Gradle DSL을 사용하고 있다. 1. 느슨한 문법 체크Groovy는 아래 3가지 경우를 모두 동일하게 인식한다.// Groovydependencies { implementation 'org.springframework.boot:spring-boot-starter-web:3.5.0' // 1번 implementation "org.springframework.boot:spring-boot-starter-test:3.5.0" // 2번 implementation('org.springframework.boot:spring-boot-starter-web:3.5.. 2025. 6. 9. [Gradle] 프로젝트가 어떻게 생겼을까? Gradle 프로젝트를 일단 한번 만들어보자. 나는 Intellij Ultimate, JDK 21, Gradle DSL은 Kotlin을 쓴다.참고! Gradle DSL? Gradle DSL은 Gradle 빌드 시스템에서 사용하는 도메인 특화 언어(Domain Specific Language)다. 쉽게 말해서 우리가프로젝트를 빌드할 때 필요한 설정, 의존성, 플러그인 적용, 태스크 등록 등 모든 작업을 정의하는 언어라고 할 수 있다. 기존에는 Groovy 기반으로 많이 썼엇는데, 요즘에는 거의 Kotlin 기반으로 쓰고 있는것 같다. 내 경우에 Kotlin을 DSL 언어로 채택한 이유는 엄격한 문법체크 때문이다. 엄격한 문법 체크는 빌드 스크립트 자체의 통일성을 보장해주고, 유지보수를 쉽게 만든다고 생각.. 2025. 6. 9. [Gradle] 멀고도 가까운.. 개발자로 일 하면서 Gradle을 익숙하게 쓰고는 있지만(주로 의존성 관리만 ㅎㅎ..), 잘 알지는 못하고 쓴다는 생각이 들었다. 말 그대로 가깝고도 먼 사이.. 요즘들어서는 AI와 같이 일하면서, 자꾸 거짓말에 당하다보니.. 내가 아는게 중요하다는 생각이 들기도 해서. 정리해본다. 아무튼! 시작해보자.개발환경아래와 같은 환경에서 학습하고있다.OS : Intel MacJava : JDK 21Gradle : 8.13 (Kotlin DSL)IDE : Intellij Ultimate, WindsurfChatGPT : PLUSGitHub : https://github.com/koojeongwoon/learn-gradle.gitGradle이 뭐야? 개발을 하다보면, 작성한 소스 코드를 '컴파일'하고, 테스트를 수.. 2025. 6. 4. [자바의 신] 어노테이션 어노테이션은 컴파일러에게 정보를 알려주거나, 컴파일 할때 와 설치(deployment)시의 작업을 지정하거나, 실행할때 별도의 처리가 필요할때 사용한다. 어노테이션은 클래스, 메소드, 변수 등 모든 요소에 선언할 수 있다. 자바에서 사용하기 위해 정해져 있는 어노테이션은 3개, 어노테이션을 선언하기 위한 메타 어노테이션은 4+1개가 있다. 먼저 사용하기 위해 정해진 어노테이션 3개는 다음과 같다.(JDK6 기준) @Override 해당 '메소드'가 부모 클래스에 있는 메소드를 오버라이드 했다는 것을 명시적으로 선언 만약 이 어노테이션을 쓰고 오버라이드 형식에 맞지 않게 코딩했다면 컴파일 에러 발생 @Deprecated 만들어진 클래스나 메소드가 더 이상 사용되지 않는 경우 컴파일러가 알려주는 용도 @Su.. 2020. 11. 28. [자바의 신] 클래스 안의 클래스 자바에서는 클래스 안에 클래스를 Nested 클래스라고 부른다. 왜 클래스 안에 클래스가 있을까? 코드를 간단하게 하기 위해서 이다. 한 곳에서만 사용하는 클래스를 논리적으로 묶어서 처리할 필요가 있을때(Static Nested 클래스) 캡슐화가 필요할때, 즉 내부 구현을 감추고 싶을때(내부 클래스) 소스의 가독성과 유지보수성을 높이고 싶을때 Nested 클래스는 자바 기반의 UI를 처리할 때 사용자의 입력이나, 외부의 이벤트에 대한 처리를 하는 곳에서 많이 사용된다. Nested 클래스는 선언 방식에 따라서 두가지로 구분할 수 있고, inner 클래스는 이름이 유무에 따라서 다시 두가지로 나눌수 있다. Static Nested 클래스 inner 클래스 로컬 내부 클래스 익명 내부 클래스 Static N.. 2020. 11. 28. [자바의 신] 예외 예외는 매우매우 중요하다. 예외를 모르면 자바를 모르는것과 같다. 예외를 생각하지 않고는 안전한 프로그램 개발이 불가능하다. 자바에서 예외는 우리가 예상한 혹은 예쌍치 못한 일이 발생하는 것을 미리 예견하고 안전장치를 하는것. try ... catch try 블록 안에 예외가 발생할 수 있는 문장을 묶어주고, catch 블록 안에 예외가 발생했을때 처리를 해준다. 반드시 모든 문장을 묶을 필요는 없고, 예외가 발생하는 부분만 묶어주면 된다. try ... catch 블록에서 예외가 발생하면 예외가 발생한 문장이후는 실행되지 않고, 바로 catch 블록으로 넘어간다. 반대로 try블록에서 예외가 발생하지 않으면, catch 블록은 실행되지 않는다. 주의할 사항 변수의 선언 try ... catch 블록도 .. 2020. 11. 28. [자바의 신] 인터페이스와 추상클래스 인터페이스나 추상클래스는 하나의 기호다. 전원버튼의 모양을 보고 전자기기의 전원을 켜는 것과 같이 인터페이스나 추상클래스의 모양을 보면 어떻게 써야 할지 알 수 있다. 보통 설계 단계에서 인터페이스를 정의하고 개발단계에서 인터페이스를 구현한 클래스를 만든다. 중요한 것은 인터페이스를 구현한 클래스가 어떻게 되어있는지의 여부. 인터페이스나 추상 클래스의 메소드를 사용하는 사용자의 입장에서 내부 구현이 어떻게 되어 있는지는 별로 안궁금하고, 그냥 호출하고, 응답을 받으면 된다. 인터페이스와 추상클래스를 사용하는 이유 설계시 선언해 두면 개발할때 기능을 구현하는데만 집중할 수 있다. 개발자의 역량에 따른 메소드의 이름과 매개변수 선언의 격차를 줄일 수 있다. 공통적인 인터페이스와 추상클래스를 선언해 놓으면 선.. 2020. 11. 20. [자바의 신] Object 사실 모든 자바 클래스의 부모는 java.lang.Object클래스 이다. extends 키워드가 없을때, 즉, 아무 클래스도 상속받지 않은 클래스는 모두 Object를 상속받은것이다. 그럼 extends 키워드가 붙은 클래스는 Object도 받고, 다른 클래스도 받은건가? 다중 상속은 안된다고 했던거 같은데.. 다중 상속은 안되지만, 여러 단계로 상속받을수 있다. 아래 그림을 보자. 왼쪽처럼 Child가 Parent와 Object를 동시에 상속받을수 없다. 하지만 오른쪽과 같이 Parent가 Object를 상속받고, Child가 Parent를 상속받는 형태로 상속 받는 것은 가능하다. 결국 Child도 Object의 변수와 메소드를 상속받은것 처럼 사용할 수 있다.(public, protected) 왜.. 2020. 10. 21. [CKEditor] 스프링 프로젝트에 CKEditor5 설치하기 우선 이전에 온라인 빌더를 활용해 다운받은 CKEditor5 라이브러리를 프로젝트에 옮겨야 한다. 나는 root 아래 /assets/admin/libs/ 에 모든 자바스크립트 라이브러리를 모아뒀기때문에, CKEditor5도 동일한 위치에 넣었다. 에디터를 적용할 jsp에 사용할 스타일시트와 자바스크립트를 삽입한다. 에디터가 들어갈 영역을 만든다. 이전에 index.html에서 에디터를 활성화하는 스크립트를 옮긴다. ClassicEditor .create( document.querySelector( '#editor' ), { toolbar: { items: [ 'heading', '|', 'fontFamily', 'fontSize', 'fontColor', 'bold', 'underline', 'itali.. 2020. 10. 15. [CKEditor] 온라인 빌더를 활용한 CKEditor5 라이브러리 설정 예전에 네이버 스마트 에디터 2.0을 활용해 만든 사이트가 있었다. 그런데 업무상 한글파일을 복사해서 붙여넣는 필요가 있는데, 안된단다.. 그래서 새로운 에디터를 찾다보니 CKEditor5를 알게됐다. 일단 테스트로 한번 만들어보고, 스프링 프로젝트에 적용하는 것 까지 해볼 예정이다. 자. 일단 요구사항은 아래와 같다. 1. 한글파일을 붙여넣었을때 무리 없이 동작해야 함. 2. 이미지 업로드가 가능해야함. 3. 유튜브, 페이스북 등 동영상을 재생할수 있어야함. 자, 해보자. 공식사이트 Quick start 코드를 그대로~ 붙여넣으면 끝난다. 나는 index.html로 만들었다. Classic editor This is some sample content. 이 파일을 실행하면, 아래와 같은 화면이 딴 나타.. 2020. 10. 15. [자바의 신] 상속 상속? 상속은 중요하다. 일단 자바에서 상속은 클래스를 선언할때 아래와 같이 extends 키워드를 쓴다. public class [작성할 클래스 이름] extends [상속받을 클래스 이름] 말로 풀어쓰면, "'내가 작성할 클래스(이하 B)'가 'extends 뒤에 있는 클래스(이하 A)'를 확장할꺼예요~" 정도가 되겠다. 그래서 어떻게 되는데요? 상속을 받으면 B는 A에 있는 자원들 중에서 접근제어자가 public, protected로 선언된 자원들(변수, 메소드)을 마치 자기가 가지고 있는 것 처럼 사용할 수 있다. private인 것들은 상속받은 클래스에서 사용할 수 없다. package com.molt.parent; public class A { public A(){ System.out.prin.. 2020. 10. 6. 도커 컨테이너 다루기 ** 시작하세요 도커/쿠버네티스 도서를 기반으로 작성했습니다. 명령어 미리보기 docker -v docker images docker pull docker create docker ps docker inspect (--type) docker start docker attach docker stop docker run docker rm docker container prune docker rmi docker image prune ▷ 도커 엔진 버전 확인 docker -v 도커는 다양항 기능이 빠르게 업데이트되고, 새로운 버전이 자주 배포되기 때문에 설치된 도커 엔진의 버전을 확인하는것은 매우 중요하다. ▷ 도커 이미지 목록 확인 docker images 현재 가지고 있는 이미지의 목록을 확인한다. 지금은 .. 2020. 10. 4. [Docker] Hyper-V 없이 Docker for Windows 사용하기 언젠가 도커 업데이트를 하면서 WSL2로 업데이트해라? 이런 안내를 보고 적용했는데, 자세히 알아보니 WSL이 Windows Subsystem for Linux라고 간단히 말해서 윈도우에서 리눅스 환경을 사용할수 있게 해주는것 같다. 윈도우 스토어에서 리눅스 배포판을 다운받아서 리눅스 환경을 실행할수 있다. 도커도 WSL2 사용을 권장하는 듯 하다. WSL1과 WSL2의 차이점은 여기서 확인하면 되겠다. WSL2는 설치할수 있는 사양이 정해져 있다. 윈도우10을 사용해야한다. x64 시스템의 경우 : 버전1903이상, 빌드 18362 이상 ARM64 시스템의 경우 : 버전 2004 이상, 빌드 19041 이상 사양을 체크하는 방법은 실행창에서 winver 입력한다. 사양이 맞다면 설치를 시작하자. Pow.. 2020. 10. 2. [자바의 신] 접근제어자 4년 넘게 개발하면서 이제야 중요성을 인식하는 것중 하나가 바로 접근제어자이다. 이 접근제어자를 제대로 쓸 줄 알아야 정보은닉, 캡슐화 등 객체지향 프로그래밍의 주요 개념들을 제대로 사용할 수 있다고 생각한다. 자바의 접근제어자는 클래스, 메소드, 인스턴스 변수, 클래스 변수를 선언할때 사용한다. 접근제어자는 public, protected, package-private, private 4가지가 있다. 이중에서 protected와 private는 클래스 안에서만 쓸 수 있다. 클래스를 선언할때 쓸 수 없다. public 같은 클래스에서 접근 가능 같은 패키지에서 접근 가능 다른 패키지에서 접근 가능 상속받았을때 접근 가능 protected 같은 클래스에서 접근 가능 같은 패키지에서 접근 가능 상속받았을때.. 2020. 10. 2. [자바의 신] 패키지 자바 개발을 하면 패키지를 참 많이 만든다. 자바에서 패키지는 그냥 폴더가 아니다. 패키지는 클래스를 분류해서 이름이 중복되지 않게 하고, 클래스의 역할을 규정해 혼동을 막는다. 패키지를 만들때 몇가지 주의사항이 있다. 패키지 이름은 java로 시작하면 안된다. 패키지 이름은 소문자로 지정해야 한다. 패키지 이름은 자바의 예약어를 사용하면 안된다. 주의사항을 기억하면서, 일단 패키지를 한번 만들어보자. javastudy폴더 아래 com 폴더를 만들고, 그 아래 molt 폴더를 만들겠다. javastudy > com > molt 폴더 아래 PackageTest.java 파일을 아래와 같이 만들자. package com.molt; public class PackageTest { public void prin.. 2020. 10. 1. 이전 1 2 3 다음