전체 글

전체 글

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

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

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

    순회중 컬렉션의 크기를 바꾸면 생기는 일 - ConcurrentModificationException 추적하기

    순회중 컬렉션의 크기를 바꾸면 생기는 일 - ConcurrentModificationException 추적하기

    0. 들어가며 멘토님께서 순회중 컬렉션의 크기를 바꾸면 어떻게 되는지 직접 수행해 보라고 권유해 주셨습니다. 마침 Collection 내부구조에 대해 공부도 해야겠다, 구조도 파악할겸 로그를 따라가며 구조를 파악해 보았습니다. 근데 이 과정이 생각보다 너무 재밌어서 공유하고자 포스팅을 하게 되었습니다. 1. ConcurrentModificationException을 발생시키기 순회중에 컬렉션의 요소를 삭제하는 코드를 실행시켜 보겠습니다. public void removeInLoop1(){ List nums = new ArrayList(); for (int i = 1; i < 11; i++) { nums.add(i); } for (Integer number : nums) { if (number % 2 ==..

    Entity와 VO, 그리고 DTO

    Entity와 VO, 그리고 DTO

    이전 포스팅에서 도메인에 대해 다루며 Entity와 VO에 대해 짤막하게 소개했습니다. 이번 포스팅에서는 Entity와 VO의 특징과 차이점에 대해 서술해보겠습니다. Entity 💡변별할 수 있는 사물 (Peter Chen, 1976) 💡정보를 저장할 수 있는 어떤것 (James Martin, 1989) 💡정보를 저장할 수 있는 사람, 장소, 물건, 사건 그리고 개념 등(Thomas Bruce, 1992) 쉽게 얘기하면 데이터를 저장하고 관리하기 위한 객체입니다. 다음과 같은 특징을 지니고 있습니다. 1. 실제 DB테이블과 매핑되는 핵심 객체 DB의 테이블과 1:1로 매핑되므로, 테이블에 없는 컬럼이 필드에 있어서는 안됩니다. 또한, Entity를 기준으로 테이블이 생성되고 스키마가 변경되기 때문에, 응..

    도메인이란?

    도메인이란?

    0. 서론 Entity - VO, DTO에 대해 포스팅하려고 공부를 하는데, 도메인에 대해서도 정의를 못내리고 있는 저를 발견했습니다. 비슷한 개념의 용어도 많고 비슷한 이름을 가진 용어도 많긴 하죠. 이걸 뭉뚱그려서 알고있다보니 소프트웨어 공학에서의 도메인은 뭐지? 하니 구체적인 대답이 나오지 않았습니다. 잘 알지도 못하면서 VO와 Entity에 대해 얘기할 수 없으니, 소프트웨어 공학의 관점에서 도메인에 대해 정리 및 공부겸 포스팅을 작성했습니다. 1. 도메인 💡소프트웨어로 해결하고자 하는 문제 영역 다른말로는 ‘개발할 대상’이라고도 할 수 있습니다. ‘온라인 쇼핑몰’을 개발해야 한다면 도메인은 ‘온라인 쇼핑몰’이 될 수 있습니다. 또한 ‘온라인 쇼핑몰’도메인은 ‘주문’, ‘결제’, ‘상품등록’, ‘..

    MySQL] 조인(Table join) 종류

    MySQL] 조인(Table join) 종류

    1. Inner join : A ∩ B, 교집합연산 쿼리 SELECT 컬럼명 [, 컬럼명] FROM 테이블A [INNER] JOIN 테이블B ON A.조인키 컬럼 = B.조인키 컬럼 Inner join은 교집합 연산으로, 조인 키 컬럼 값이 양쪽 테이블에 모두 존재하는 경우만 추출합니다. INNER 키워드는 생략가능하지만, 가독성을 위해 왠만하면 써주는것이 좋습니다. 예시 테이블 실행 쿼리 SELECT * FROM 상품 P INNER JOIN 옵션 O ON P.상품ID = O.상품ID 결과 주의할점은, 보시다시피 id 3인 탕수육 컬럼이 존재하지 않습니다. 왜냐하면 옵션 테이블에 상품ID가 3인 튜플이 존재하지 않기 때문입니다. 위처럼 inner join은 코인 키 컬럼값이 모두 존재하는 데이터만 출력하..

    AWS) EC2 SSH 접속시 Permissions 0644 for '~.pem' are too open.

    AWS) EC2 SSH 접속시 Permissions 0644 for '~.pem' are too open.

    1. 발단 팀프로젝트 진행을 위해 ec2 인스턴스를 생성, pem키를 사용해 ssh접근시 발생 2. 상황 3. 실패원인 에러명에 나와있는 대로, pem파일의 permission 문제 4. 힌트 5. 처리 chmod 400 ooo.pem 을 입력해 권한을 변경 6. 결과 정상적으로 접속 성공 7. 느긴점

    Spring boot) 빌드 실패 오류 (org.gradle.plugin.api-version ...)

    Spring boot) 빌드 실패 오류 (org.gradle.plugin.api-version ...)

    1. 발단 팀프로젝트를 위해 spring boot 빌드중에 자꾸 빌드가 안되고 있었음 start.spring.io로 만들었으며, 의존성도 문제 없고, gradle 버전과 java sdk버전 문제도 없었음 2. 상황 빌드가 계속 실패. 에러문구는 다음과 같았음. A problem occurred configuring root project 'core'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.0. Required by: project : > org.springframework.boot:org.spring..

    헤드퍼스트 디자인 패턴 06.커맨드(Command) 패턴

    헤드퍼스트 디자인 패턴 06.커맨드(Command) 패턴

    * 본 포스팅은 한빛미디어의 헤드퍼스트 디자인 패턴을 공부한 내용을 정리한 글입니다. 저의 부족한 생각과 주관으로 틀린 내용이 있을 수 있으니, 자세한 내용이 궁금하시다면 해당 책을 읽어보시길 추천드립니다. 1.커맨드 패턴이란 ✏️커맨드 패턴(Command Pattern) 객체의 행위method)를 캡슐화함으로써 주어진 여러 기능을 실행하지만 재사용성이 높은 클래스를 설계하는 패턴이다. 커맨드 객체는 통해 일련의 행동을 특정 리시버와 연결함으로써 요청을 캡슐화한 것입니다. 그렇게 되면, 호출시에 어떻게 처리되는지는 신경을 쓸 필요가 없고 처리가 된다라는 사실만 알 수 있습니다. 전등을 키는 경우를 예로 들어보겠습니다. 전등도 사실 그냥 켜지는게 아니라 전기를 끌어와서 형광등의 전력량에 알맞게 변환하고, ..

    헤드퍼스트 디자인 패턴 05.싱글턴(Singleton) 패턴

    헤드퍼스트 디자인 패턴 05.싱글턴(Singleton) 패턴

    * 본 포스팅은 한빛미디어의 헤드퍼스트 디자인 패턴을 공부한 내용을 정리한 글입니다. 저의 부족한 생각과 주관으로 틀린 내용이 있을 수 있으니, 자세한 내용이 궁금하시다면 해당 책을 읽어보시길 추천드립니다. 목차 0. 싱글턴이란? 1. 간단한 싱글턴 2. 스레드 안정성 2-1. 동기화(synchronized) 2-2. 인스턴스 미리 선언하기 2-3. Double-Checked Licking 2-4. lazyHolder(요청시 초기화 홀더) 패턴 3. 직렬화 4. 리플랙션 5. enum을 사용한 싱글턴 6. 싱글턴 남용의 위험성 0. 싱글턴(Singleton)이란? 스레드 풀, 또는 로그용 객체, 디바이스 드라이버등 하나만 있어도 충분하고, 여러개면 오히려 문제가 발생할 수 있는 공유객체 또는 유일하게 관..

    Int와 Integer의 차이

    Int와 Integer의 차이

    이번에 회사에서 개발을 하면서 난감했던 적이 있었습니다. 페이징 작업을 위해 클라이언트로부터 limit - offset값을 받아야 했습니다. excel 출력을 위해서 페이징하지 않는 목록을 받기 위해 limit - offset값을 받지 않는 경우도 있었죠. 그런데, 후자의 경우 limit - offset 둘다 0으로 입력받게 되었습니다. 망했죠 1. int란 int는 primitive 자료형이다. primitive 자료형은 데이터의 형태에 따라 값이 저장될 공간의 크기 및 형식을 정의합니다. 2. Integer란 int 자료형을 감산 wrapper class 이다. 자료형(data type)가 아닌 class입니다. 매개변수로 객체가 필요할 떄, 자료형이 아니라 객체로 저장할 떄, 객체간 비교가 필요할 ..

    헤드퍼스트 디자인 패턴 04.팩토리(Factory) 패턴 - 팩토리 메서드

    헤드퍼스트 디자인 패턴 04.팩토리(Factory) 패턴 - 팩토리 메서드

    * 본 포스팅은 한빛미디어의 헤드퍼스트 디자인 패턴을 공부한 내용을 정리한 글입니다. 저의 부족한 생각과 주관으로 틀린 내용이 있을 수 있으니, 자세한 내용이 궁금하시다면 해당 책을 읽어보시길 추천드립니다. * 내용이 너무 많아, 이번 팩토리 챕터는 나눠서 작성하게 되었습니다 1. 지난 포스팅 지난 포스팅에선 심플 팩토리 패턴에 대해서 다뤘습니다. 심플 팩토리 패턴은 엄밀히 말하면 관용구에 가깝다고 말씀 드렸습니다. 최첨단 피자의 최초 코드에서 생성부를 심플 팩토리 패턴을 사용해 캡슐화 하였습니다. 2. 팩토리 메서드 패턴 팩토리 메소드 패턴은 서브클래스에서 어떤 클래스를 만들지 결정함으로써 객체 생성을 캡슐화합니다. 예를 들자면, 최첨단 피자가게는 크게 생산자 클래스와 제품 클래스로 나눌 수 있습니다...

    헤드퍼스트 디자인 패턴 04.팩토리(Factory) 패턴 - 심플 팩토리

    헤드퍼스트 디자인 패턴 04.팩토리(Factory) 패턴 - 심플 팩토리

    * 본 포스팅은 한빛미디어의 헤드퍼스트 디자인 패턴을 공부한 내용을 정리한 글입니다. 저의 부족한 생각과 주관으로 틀린 내용이 있을 수 있으니, 자세한 내용이 궁금하시다면 해당 책을 읽어보시길 추천드립니다. * 내용이 너무 많아, 이번 팩토리 챕터는 나눠서 작성하게 되었습니다. 1. 들어가기 전에 💡 객체의 인스턴스 생성은 때론 캡슐화하여 숨겨야 할 때가 있습니다. 이를 위해 팩토리 패턴을 사용해 불필요한 의존성을 줄여 결합 문제를 해결해 봅시다. 팩토리 패턴의 필요성 객체의 인스턴스 생성은 무분별하게 사용할시, 사이드 이펙트가 생길 수 있다. 하지만 인스턴스 생성 없이 프로그램 작성은 불가능하므로, 변화에 유연하게 만들어야 한다. 인터페이스를 기반으로 다형성을 활용한 팩토리 패턴을 사용하면, OCP원칙..

    JavaScript)문자열 자르기 - substring, slice() [짧]

    JavaScript)문자열 자르기 - substring, slice() [짧]

    비슷비슷하지만 항상 헷갈려서 따로 정리해 봅니다. var str = "12345"; var subStringResult = str.substring(0,3); var sliceResult = str.slice(0,3); console.log("substring : " + subRs); //123 console.log("slice : " + sliceRs); //123 네 같습니다. 근데 왜 따로 존재하는걸까요? var str = "12345"; var subStrungResult1 = str.substring(2,-2); var sliceResult = str.substring(-2,2); console.log("subStrungResult1 : " + subStrungResult1); //12 cons..

    mybatis) int 자료타입 if test 무조건 안타던 문제

    mybatis) int 자료타입 if test 무조건 안타던 문제

    1. 발단 app단에 자료 목록을 paging해서 주기 위해 limit-offset값도 받는 api 개발 2. 상황 0번째부터 10개값 (limit 0, offset 10)을 출력하는데 모든목록이 다 출력됨 3. 실패원인 mybtis에서 if조건 대상이 int형이고 값이 0이면 param != '' 조건을 통과를 못하고 있었음 4. 힌트 처음 테스트당시 자료가 페이징될 갯수보다 많았었는데 놓쳤던듯 5. 처리 if-test 조건문 변경 6. 결과 정상적으로 페이징처리된 값들을 출력함 7. 느긴점 ... 이거 자료형을 다 string으로 받아서 처리하는게 맞을까 생각이 듬

    mysql)전화번호 masking 작업

    mysql)전화번호 masking 작업

    1. 발단 전화번호를 마스킹해서 내려주는 비즈니스 로직이 필요 ex) 010-1111-2222 -> 010-1**1->2222 2. 상황 마스킹처리를 서버에서 할지, DB에서 처리할지에 대한 고민 마스킹 관련 자료 검색시 방법이 다양 3. 실패원인 DB가 마스킹 연산해서 서버로 내려주게끔 개발. 하지만, 리소스 관리 측면에서 DB에서 값을 정제해서 내려주기보단, 서버단에서 처리하는게 맞았음. 4. 힌트 이전에 컬럼 합성 데이터 처리에 대해 어느부분에서 처리하는게 맞는지 다양한 곳에 문의해본 결과, 서버단에서 처리하는게 정석이라는 얘기를 들었었다. 5. 처리 검색해본 자료중에 replace를 사용하는 방법도 있었지만, 만약 해당 문자열 패턴이 반복되면, 정책과 다르게 마스킹처리가 되는 부분이 있어 conc..

    mysql-mybatis)일정기간별 검색

    mysql-mybatis)일정기간별 검색

    1. 발단 기간별 검색 구현 2. 상황 between A and B 까지 하면 A~B까지 출력하겠지 라고 낙관적인 생각 3. 실패원인 A~B까리이지만, A가 포함인지 미포함인지, B가 포함인지 미포함인지 고려 안함 동료분이 23:59:59까지 조건으로 하면 될거같은데요~ 를 너무 쿨하게 참조만 함 (...) 쉬운 작업이라 생각하고 테스트 케이스를 너무 빈약하게 잡았음 (당일만 검색 고려 안함 + 산출값 확인 미흡) 3. 힌트 30일전부터 오늘까지의 데이터를 뽑아올 때, between A and B and NOW() 를 사용했었음. 4. 처리 DATE_FORMAT(CREATE_DT, '%Y-%m-%d') =]]> #{startDt} AND DATE_FORMAT(CREATE_DT, '%Y-%m-%d') #{..

    Mybatis) 조건문 if-else -> choose-when-otherwise

    Mybatis) 조건문 if-else -> choose-when-otherwise

    mybatis에서 if-test만 사용하는게 아닌. if-else를 사용해야 할때 choose-when을 사용하면 됩니다. //codition1 is true, then running this block //condition1 is false and condition2 is true, then running this block //all contition is false, then running this block

    Checked, Unchecked Exception

    Checked, Unchecked Exception

    1. Exception이란? exception이란 jabva.lang.Exception클래스 및 Exception클래스의 서브클래스들을 지칭합니다. 여기서 checked exception과 unchecked exception으로 나뉘어 집니다. 2. Exception 종류 2-1. Unchecked Exception RuntimeException을 상속한 서브클래스들이다. 명시적으로 예외처리를 강제하지 않습니다. 프로그램에 오류가 있을때 발생하도록 의도되었습니다. 2-2. Checked Exception Check exceptuon(RuntimeException)을 제외한 나머지 exception들입니다. 복구 가능한 예외로 판단하며, throw로 처리를 위임하거나 catch문으로 예외처리를 해야합니다...

    헤드퍼스트 디자인 패턴 03.데코레이터(Decorator) 패턴

    헤드퍼스트 디자인 패턴 03.데코레이터(Decorator) 패턴

    * 본 포스팅은 한빛미디어의 헤드퍼스트 디자인 패턴을 공부한 내용을 정리한 글입니다. 저의 부족한 생각과 주관으로 틀린 내용이 있을 수 있으니, 자세한 내용이 궁금하시다면 해당 책을 읽어보시길 추천드립니다. 1. 목표 : 스타비즈 주문시스템 초대형 커피전문점 스타버즈의 주문시스템 리팩토링 단기간에 폭팔적으로 성장한 스타버즈 커피전문점은 시스템이 아직도 초창기 조그마한 까페에 머물러 있습니다. 우리는 이제, 스타버즈의 주문 시스템을 현재 수준에 맞게 리팩토링 해야 합니다. 현재 주문 시스템은 규모에 걸맞지 않게 허술합니다. 초대형 커피 전문점인 만큼 손님의 기호에 맞게 다양한 커스텀이 가능한데, 이대로라면 Becerage를 상속받는 클래스들이 옵션의 수만큼 생성되게 됩니다. 수백개 수천개가요! 관리가 매우..

    헤드퍼스트 디자인 패턴 2장. 옵저버(Observer)패턴

    헤드퍼스트 디자인 패턴 2장. 옵저버(Observer)패턴

    * 본 포스팅은 한빛미디어의 헤드퍼스트 디자인 패턴을 공부한 내용을 정리한 글입니다. 저의 부족한 생각과 주관으로 틀린 내용이 있을 수 있으니, 자세한 내용이 궁금하시다면 해당 책을 읽어보시길 추천드립니다. 핵심 - 느슨한 결합 subject는 observer에게 값 갱신만 알려줄 뿐, 구성엔 관여하지 않음 반대로 observer는 subject에게 값 갱신만 받을뿐, 구성엔 관심이 없음 - observer패턴의 push와 pull push는 observer에게 갱신을 알리며 데이터를 전달한다 pull은 갱신만 알리며, observer는 subject의 getter method를 통해 필요한 값만 가져온다. Weather-O-Rama의 차세대 인터넷 기반 기상 스테이션 구축하기! 구조 WeatherDat..