IDE & Framework

    [IntelliJ] codeStyle - naver code convention 적용하기

    [IntelliJ] codeStyle - naver code convention 적용하기

    0. 개요 coding convention? 소스코드의 작성 규칙을 정의한 것입니다. 소스코드의 일관성을 유지할 수 있고, 같은 규칙을 공유하는 팀원들이라면 빠르게 읽고 이해할 수 있어 유지보수에 도움을 줍니다. [네이버 핵데이 자바 코딩 컨벤션 내용 확인하기] [네이버 핵데이 자바 코딩 컨벤션 git repo] 어떻게 적용할까? 정적 코드 분석 도구를 사용해 적용합니다. 이를 사용해 적용하게 되면, 규칙에 알맞지 않은 코드가 존재할 시 컴파일이 되지 않도록 설정할 수 있습니다. 정적 분석 도구란? 소스코드, 바이너리 코드를 분석해 버그 및 취약점을 찾아내는 도구입니다. 컴파일 하지 않고 코드 자체를 분석하므로, 코딩 컨벤션의 규칙을 확인하기에 알맞습니다. 대표적으로 Checkstyle이 있습니다. 적용..

    Spring - MyBatis 설정하기

    Spring - MyBatis 설정하기

    0. 개요 개인 프로젝트를 할 때, 블로그 글을 보고 복사-붛여넣기로 의존성 설정을 해왔었는데요, 이번엔 좀 정확한 정보를 직접 보고 판단해서 설정하도록 공식문서를 보면서 의존성 설정을 하게 됬습니다. 1. 의존성 설정 Spring boot에서 DB툴로 MyBatis를 사용하기 위해서는 총 두개의 의존성 설정을 해 주어야 합니다. 하나는 MyBatis이고 하나는 MySQL Connector JAVA 입니다. MyBatis 의존성 설정을 통해 MyBatis와 Spring Boot의 통합 설정이 자동으로 이루어지고, MyBatis의 기능을 Spring Boot 애플리케이션에서 사용할 수 있게 됩니다. 그리고 MySQL Connector JAVA 의존성 설정을 통해 java 애플리케이션에서 MySQL 데이터베..

    [단축 URL 프로젝트 URLumberjack] - 기타 규칙 정의

    [단축 URL 프로젝트 URLumberjack] - 기타 규칙 정의

    0. 개요 서버 및 기술외에 프로젝트에 필요한 가이드라인이나 도구를 선택한 이유과 근거를 작성했습니다. 1. API 문서화 툴/프레임워크 RestDocs Swagger를 문서화 툴이라고 하기에는 조금 애매하지만, API별로 테스트도 가능하면서 API에 대한 스펙을 출력해주기에 RestDocs와 비교를 해 보았습니다. RestDocs를 선택한 이유는 다음과 같습니다. 스웨거만 사용해 봤기에, 사용해보지 않은 RestDocs에 관심이 갔습니다. 테스트코드를 작성하며 진행할 것이므로, 문서작성에 반드시 테스트코드가 필요한 RestDocs를 유지하는데 문제가 없을것이라 판단했습니다. RestDocs는 문서화를 위해 많은 클래스를 유지관리 해야 합니다. 그러나, Swagger는 프로덕션 코드가 지저분해지고, 이를..

    [단축 URL 프로젝트 URLumberjack] - 기술 스택 정의

    [단축 URL 프로젝트 URLumberjack] - 기술 스택 정의

    0. 개요 1. 기술 스택 Overview 1. Java 17버전 선택 이유 IT업계의 흐름을 따라가려면 높은 버전을 사용해야 한다 버전이 높아진 다는것은 코드 작성 더 간편하게, 안정성과 성능을 향상시킬 수 있도록 변화하는 것입니다. 굳이 잘 쓰고 있는데 바꿀 필요가 있나? 가 아니라, 적극적으로 학습하기 위해서 선택하였습니다. Java17은 LTS버전으로, 지원기간이 상당히 길다 java11은 26년까지 지원하며, java8은 30년까지 지원합니다. java17은 29년까지 지원으로 java8 급으로 안정적으로 사용할 수 있습니다. JAVA 출시 주기가 고정되어 명확해졌다 이제 JAVA의 출시 주기가 고정화 되어서 업데이트 지원이 필요한 시기를 안정적으로 예측할 수 있게 되었습니다. 또한 안정적으로 ..

    [단축 URL 프로젝트 URLumberjack] - devOps 정의

    [단축 URL 프로젝트 URLumberjack] - devOps 정의

    0. 들어가며 새 프로젝트를 시작하면서 가장 먼저 정해야 할 것은 서버 스펙입니다. 이를 정하는 데 있어서는 비용, 문서(공식 문서 및 구글링 문서량), 학습 난이도 세 가지가 가장 중요한 요소로 느껴졌습니다. 물론, 이는 상황에 따라 우선순위가 달라질 수 있지만요 ㅎㅎ 프로젝트를 진행할때 서버스펙에 관련하여 고민한 내용과 선택한 이유들을 정리해 보았습니다. 1. 서버스펙 overview 2. NCP(Naver Cloud Platform) 선택 이유 Cloud 비용이 가장 큰 비용 항목 중 하나이지만, 운이 좋게도 크레딧 지원을 받을 수 있게 되었기 때문에 이 큰 문제를 해결할 수 있었습니다. 또한, aws를 사용해온 경험이 있는 제게 NCP의 UI/UX는 쉽고 편안하게 사용할 수 있었습니다. 게다가 공..

    [짧] FCM을 통해 앱 삭제여부 확인

    [짧] FCM을 통해 앱 삭제여부 확인

    https://medium.com/박상권의-삽질블로그/앱-삭제-측정-방법-나는-네가-어제-앱을-삭제-했다는것을-알고-있다-653bc7872cb6 [앱 삭제 측정 방법]나는 네가 어제 앱을 삭제 했다는것을 알고 있다 앱 설치율도 중요하지만, 앱 삭제율도 중요합니다. 사용자가 앱을 지웠는지 어떻게 알 수 있을까요? Android/iOS 모두 적용되는 ,사용자가 앱을 삭제한것을 측정하는 방법에 대해 공유합니다. medium.com 앱 삭제여부 판별이 필요했었는데, 상권 개발자님 덕분에 쉽게 해결하게 되었네요. 브로드캐스트 리시버를 통해 앱 삭제 동작을 알 수는 있는데, 본인이 삭제되는거면 받질 못하더라구요 ㅎ

    Spring boot 서버를 Gradle로 build해 jar로 직접 배포하기

    Spring boot 서버를 Gradle로 build해 jar로 직접 배포하기

    개요 spring boot 프로젝트는 jar 또는 war 파일로 배포할 수 있습니다. jar 파일로 배포하는 경우 : 내장된 톰캣서버 쨰로 배포할것이면 jar로 배포합니다. war 파일로 배포하는 경우 : 이미 WAS환경이 존재해 내장 톰켓서버를 빼고 배포하려면 war파일로 배포하면 됩니다. 그리고 빌드 관리도구(Maven, Gradle)에 따라 배포하는 방법이 다릅니다. 저는 Gradle을 사용하므로 Gradle 방식으로 배포하는 방법에 대해서 기술하겠습니다. 1. JAR 파일 빌드 릴리즈 전 jar파일을 만들어야 합니다. jar 파일을 만드는방법은 IDE를 사용하는 방법과 CLI로 terminal에서 진행하는 방법이 있습니다. 1-1.IDE 사용 inteliJ 더보기 alt + alt 로 Run An..

    [Spring] MyBaits Insert 후 ID 받기 (짧)

    [Spring] MyBaits Insert 후 ID 받기 (짧)

    방법은 두가지가 있다. 1. 처럼 사용하는 방법은 useGeneratedKeys="true"를 입력하고 KeyColum은 pk table명을, keyProperty는 해당 pk값을 넣을 변수명을 입력하면 된다. 위의 경우엔 Map 타입을 매개변수로 주었다면 servicdId-pk값 쌍이 map에 추가되고 DTO 객체를 매개변수로 주었다면 DTO의 serviceId 필드값이 pk값이 될 것이다. 2. INSERT INTO CP_SERVICE VALUES SELECT LAST_INSERT_ID() 처럼 쓰는방법도 있다. 파라미터로 넘긴 Service객체에 id가 int타입으로 주입되게 된다.

    Permission 처리를 좀 더 쉽게 하려면? TedPermission!

    시연용 앱을 전에 제작하다가, 권한 분류랑 관리도 제대로 안해놓고 대충 다 선언해 놨더라구요... 급하게 고쳐야해서 보는데 권한쪽을 수정해야하는데 너무 스트뤠스... 그떄 정말 도움 많이 받았습니다... 쓰기 쉽고 명확한 박상권 개발자님의 ted permission 사용해 보세요! https://greensky0026.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F TISTORY 나를 표현하는 블로그를 만들어보세요. www.tistory.com

    [Kotlin] doze모드 방지, 절전모드 방지 하도록 요청하기

    [Kotlin] doze모드 방지, 절전모드 방지 하도록 요청하기

    Doze and Stanby public reference https://developer.android.com/training/monitoring-device-state/doze-standby?hl=ko 잠자기 및 앱 대기 모드에 맞게 최적화 | Android 개발자 | Android Developers 앱에서 Android 6.0의 절전 기능을 테스트하고 최적화합니다. developer.android.com 절전모드로 진입하게 된다면, 아래와같은 제한사항이 생긴다. FCM을 사용해 주기적으로 활성화 시키는 방법도 있지만, 앱단에서 해결할 수 있는 방법은 아래의 코드와 같다. 제한사항 네트워크 엑세스 정지 wake lock 무시 유지보수 기간 지연 동기화 어댑터 실행 X JobScheduler 실행 X..

    [Spring] 관념지향 프로그래밍(Aspect Oriented Promgramming)

    [Spring] 관념지향 프로그래밍(Aspect Oriented Promgramming)

    AOP란? 어떠한 로직을 기준으로 핵심적인 관점과 부과적인 관점으로 나눠 각각 모듈화 하는 방식이다. 관점을 기준으로 모듈화 한다는 것은, 코드를 부분적으로 나누어서 모듈화하겠다는 것. 이 관심사를 Crosscutting Concerns(흩어진 관심사)라고 부르며 이를 모듈화 한것이 Aspect이다. 주요 개념 Aspect : 흩어진 관심사를 모듈화 한 것, Target : Aspect를 적용하는 곳 Advice : 실질적인 기능을 담은 구현체 JointPoint : Advice가 적용될 위치 PointCut : JointPoint의 상세 스펙 정의. ex) A메서드 호출 전,후로 호출할 것 스프링 aop 특징 접근제어 및 부가가능을 추가하기 위해 프록시 패턴 기반의 AOP 구현체를 사용한다. 스프링 빈..

    Spring DI, IoC

    Spring DI, IoC

    DI (Dependency Injection) 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴이다. 두 객체 사이에 인터페이스를 둬 클래스 레벨에서는 의존관계가 고정되지 않도록 하고, 런타임시에 관계를 주입하여 유연성 확보 및 결합도 낮춘다. public class MyRoom(){ private Desk desk; } public class Desk(){ } 에서 MyRoom 객체가 Desk 객체에 의존성을 지닌다. 여기서, public class MyRoom(){ private Desk desk; public MyRoom(){ this.desk = new Desk(); } } 일 경우 결합도가 매우 높다는 문제가 발생한다. 왜냐하면, 내 방에 어떤 물건이 있는지에 대한 관심이 분리되지 않았기 떄..

    [Spring] @Scheduled cron 표현식

    [Spring] @Scheduled cron 표현식

    단위 : 범위 초 : 0~59 분 : 0~59 시 : 0~23 일 : 1~31 월 : 1~12 or JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 요일 : 1~7 or SUN MON TUE WED THU FRI SAT 기호 : 뜻 * : 모든 값 ? : 설정 없음 (일 또는 요일에만) , : 배열 (1,2,4 : 1,2,4만) - : 앞-뒤 범위 전체(1-3 : 1부터 3까지) / : 간격 (1/10 : 1부터 10마다 1,11,21,31...) 0 0 0 * * * 매일 00시 00분 00초에 실행 0 0 3,4 * * 2-6 월요일부터 금요일 00시 00분 3시,4시마다 실행 0 0 9/2 5 * * 매월 5일 9시부터 2시까지 00분 00초에 실행 0 30 1..

    WSL2 LEMP 초간단 구축 및 구동

    환경 : Windows에 WSL2를 사용한 Ubuntu 18.0.4 Windows10에서 WSL2로 Ubuntu 설치 및 구동은 아래 링크 참고 https://greensky0026.tistory.com/238 구축 1. 우분투 갱신 및 업데이트 sudo apt-get update && sudo apt-get upgrade 2. Nginx 설치 sudo apt install nginx //sudo service nginx start 구동확인 3. MySQL 서버 설치 sudo apt install mysql-server //sudo usermod -d /var/lib/mysql/ mysql 숏컷등록 //sudo service mysql start 구동확인 3-1. MySQL root 계정 비밀번호 생성 ..

    [짧] Android aar에 application proguard 규칙 적용시키기

    프로젝트 내부 모듈을 만들어서 작업한 경우엔 특이사항 없이 proguardFiles를 사용하면 되는데, aar의 경우 난독화를 사용헤 apk를 말아버리면, aar 소스를 apk에서 거의 못찾게 되버린다. 그래서 이게 규칙대로 적용이 됬나, 안됬나를 판단하기가 힘들어 찾아보았다. aar에 특정 프로가드 규칙을 적용시키고 싶다면, proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 대신 consumerProguardFile 'proguard-rules.pro' 를 사용하면 해당 규칙이 aar 소스까지 적용되어 난독화가 되게 된다. 물론 프로가드 규칙이 별도로 존재하지 않는다면, 애초에 해당 라인을 입력할 필요가 ..

    Open Vpn 다중접속

    Open Vpn 다중접속

    이번 서버작업을 하면서 상용-개발서버의 vpn 두가지로 작업을 하게 되었다. 번갈아가면서 접속하며 작업하니 여간 불편한게 아니여서 구글링을 좀 해보게 됬고, 찾게 되었다. C:\ProgramData\Microsoft\Windows\Start Menu\Programs\OpenVPN\Utilities에 있는 add a new tap-windows6 virtual network adapter를 관리자권한으로 실행시켜 이더넷 네트웤을 추가하면 위처럼 복수의 vpn에 접속할 수 있다.

    [PHP] Code Igniter에서 MySQL 사용

    [PHP] Code Igniter에서 MySQL 사용

    * 참고 -> (= Object Operator) : 객체 범위 내에서 객체에 접근하기 위해서 사용하는 오퍼레이터입니다. => (= Double Arrow Operator) : 배열의 키, 값을 할당할 때 사용하는 오퍼레이터입니다. DB conntect 위치 : conifg/database.php $db[’dbName’] = array( ... ) 꼴로 여러 커넥션을 만들 수 있음.커넥션의 각 값의 정보는 위 링크에 잘 나와있음. $active_group ='dbName'; 으로 기본 커넥션을 설정할 수 있음. $db['real'] = array( 'hostname' => '데이터베이스 서버 이름', 'username' => '사용자아이디', 'password' => '사용자비밀번호', 'database..

    [PHP] Code igniter MVC

    [PHP] Code igniter MVC

    Controller controllers폴더 내에 위치해야 한다. CI_Controller를 상속받는 클래스를 생성해 컨트롤러를 여러개 생성할 수 있다. class Practice extends CI_Controller { ... } 위의 경우는 https://YOUR_SERVER_ENDPONT_NAME/practice로 접근이 가능하다. 원래는 URL 중간의 index.php의 존재가 있었으나(이전 포스팅 참조), 세팅을 통해 URL 중간에서 제거할 수 있음(https://www.cikorea.net/bbs/view/lecture?idx=7073) 내부에 index() 함수 생성시 https://YOUR_SERVER_ENDPONT_NAME/practice로 접근하면 index()가 호출된다. index..

    [PHP] Code Igniter란?

    [PHP] Code Igniter란?

    Itroduce Code Igniter란, php기반의 오픈소스 프레임워크입니다. 또다른 php 기반 프레임워크로는 라라벨이 있습니다. java에 spring이 있다면, php엔 Code Igniter와 라라벨이 있죠. 현재까지도 활동하는 한국 사용자 포럼도 있으니, 궁금하시면 접속해 보세요! [커뮤니티 바로 가기] Application Architecture 1. index.php는 ci를 시동하기 위한 Front Controller로써, 기본적인 리소스들을 초기화 시킵니다. 2. Router는 각각의 http 요청이 어디로 연결되어 어떻게 수행되어야 하는지를 알려준다. (이 과정에서, 캐시파일이 있다면 실행 과정을 거치지 않고 브라우저에 캐시를 보낸다.) 3. Security는 controller가 ..

    [Kotlin] Android Room Database 기본 예제

    [Kotlin] Android Room Database 기본 예제

    저번에 SQLite 포스팅을 해놓고 Room database는 빼먹었더라구요. ㅎㅎ; 그래서 늦게나마 포스팅 해 보겠습니다. 아래 코드 예제는 인강을 들으면서 작성한 코드입니다. [전체 코드 보기] https://github.com/gr2nsky/fastCampus/tree/main/basic/calculator GitHub - gr2nsky/fastCampus Contribute to gr2nsky/fastCampus development by creating an account on GitHub. github.com room이란? 스마트폰에 내장된 DB에 데이터를 저장하기 위해 사용하는 ORM 라이브러리 입니다. room은 내부적으로 sqlite를 사용하지만, 이를 자바나 코틀린으로 매핑해 접근성과 ..