전체 글298 티스토리 블로그 광고 쿠팡 파트너스 사용하기 블로그 광고에 주로 많이 사용되는 광고 플랫폼 구글 애드센스 카카오 애드핏 쿠팡 파트너스 블로그 광고 종류 CPM (Cost Per Mile) 방문자가 글을 읽다가 광고를 보는 것만으로 수익이 들어옴 주로 노출 1,000 회당 수익 발생 단가가 낮아 일일 방문자가 만 단위 이하라면 효과가 많이 낮음 CPC (Cost Per Click) 방문자가 글에 있는 광고를 클릭했을 때 수익이 발생 CPM보다 단가가 높음 평균 단가 100원 ~ 1,000원 구글 애드센스, 카카오 애드핏, ... CPA (Cost Per Action) 제휴 마케팅이라고도 부르며 광고주가 원하는 행위에 따라 수익이 들어오는 광고 서비스 가입이나 홍보한 상품이 판매되었을 때 정해진 커미션을 받는 광고 평균 단가 500원 ~ 100,000.. 기타 2023. 6. 14. [JPA] N+1 발생 원인과 해결책 JPA N+1문제 1번의 쿼리를 조회하기 위해 설계하였으나, 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 문제 When . 언제 발생하는가 ? JPA Repository를 활용해 find 인터페이스 메소드를 호출할 때 발생 Who . 누가 발생시키는가 ? 1:N 또는 N:1 관계를 가진 엔티티 조회 시 발생 How . 어떻게 발생되는가 ? JPA Fetch 전략이 EAGER 전략으로 데이터 조회하는 경우 JPA Fetch 전략이 LAZY 전략으로 데이터를 가져온 이후, 연관 관계인 하위 엔티티를 다시 조회하는 경우 Why . 왜 발생하는가 ? JPA Repository find 메소드 실행 시 첫 쿼리에서 하위 엔티티까지 한 번에 가져오지 않고, 하위 엔티티를 사용할 때 추가로 조회하기 때문에 발생 .. JVM/JPA 2023. 5. 30. [JPA] QueryDSL 소개 및 프로젝트 설정하기 QueryDSL이란? QueryDSL은 하이버네이트 쿼리 언어(HQL: Hibernate Query Language)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다. QueryDSL은 정적 타입을 이용하여 SQL과 같은 쿼리를 생성할 수 있게 해 준다. 자바 백엔드 기술은 Spring Boot와 Spring Data JPA를 함께 사용한다. 하지만, 복잡한 쿼리, 동적 쿼리를 구현하는 데 있어 한계가 있다. 이러한 문제점을 해결할 수 있는 것이 QueryDSL이다. QueryDSL이 등장하기 이전에는 Mybatis, JPQL, Criteria 등 문자열 형태로 쿼리문을 작성하여 컴파일 시에 오류를 발견하는 것이 불가능했다. 하지만, QueryDSL은 자바 코드로 SQL 문을 작성할 수 있어 .. JVM/JPA 2023. 5. 25. [Git/GitHub] Git Merge 와 GitHub Merge Git / GitHub 의 Merge 종류 Git Merge 종류 Merge Squash and Merge Rebase and Merge 앞으로 모든 예시에는 기준 브랜치 master로, master 브랜치를 base로 분기된 브랜치를 feature 브랜치라고 부르겠다. 모든 테스트는 feature 에서 master 로 merge하는 과정을 예시로 들겠다. Merge 상황에 따라 Fast-forward Merge, Recursive Merge로 동작한다. # current merge = master git merge Fast-forward Merge master 와 feature 형상이 동일한 상태인 경우 feature branch에 추가된 commit이 master branch에 그대로 붙게되며, 병합.. SCM/Git + Github 2023. 5. 17. [TIL] 파이썬(Python)의 구조 클래스와 인스턴스 클래스란 ? 속성과 데이터를 변형하는 함수를 같은 이름 공간에 묶어 새로운 형식을 정의하는 것 인스턴스란 ? 클래스를 복사해서 생성한 복사본 클래스와 인스턴스 객체의 관계 쿠키 = 클래스 쿠키틀을 통해 찍어낸 과자 = 인스턴스 클래스 정의 문법 (define) 클래스의 멤버는 멤버 변수와 멤버 메서드로 구성 class 라는 키워드를 사용 클래스에는 멤버 변수를 초기화할 수 있고, 멤버 메소드를 정의 멤버 메소드는 def 라는 키워드를 사용하고, 첫 번째 매개변수(인자)는 예약되어 있는 자리여서 self 라는 단어 사용 예제 Person 클래스 정의, p1 이라는 인스턴스 객체 생성 예제 # class 클래스명(상위클래스): #클래스에 대한 설명 #def 함수명(self, 인자1, 인자2.. 개발 스터디 2023. 1. 24. [Database] 뷰(View)의 개념 및 특징 뷰(View)란 무엇인가? 뷰는 하나 이상의 테이블이나 다른 뷰의 데이터를 볼 수 있게 하는 데이터베이스 객체이며, 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블이다. 뷰는 저장장치 내에 물리적으로 존재하지 않지만 사용자에게 있는 것처럼 간주된다. 뷰는 데이터 보정작업, 처리과정 시험 등 임시적인 작업을 위한 용도로 활용된다. 뷰는 조인문의 사용 최소화로 사용상의 편의성을 최대화 한다. 뷰(View) 사용목적 여러 테이블의 조인과 그룹핑과 같은 복잡한 쿼리를 뷰에 저장시켜놓고, 저장한 뷰의 정보만 가져와 더 쉽고 편리하게 사용할 수 있다. (일종의 함수 형태) 데이터 보안에서도 유리한데, 뷰를 보면 컬럼과 데이터만 공개되므로 .. Database 2023. 1. 12. 마이크로서비스 아키텍처(MSA)의 기본 개념 소개 MSA 소개 MSA 란? 하나의 어플리케이션을 다수의 독립적인 서비스들의 집합으로 구성하는 것으로 서비스 지향 아키텍처(SOA) 스타일의 소프트웨어 개발 기법이다 각자 별도의 프로세스에서 실행되며, HTTP API 같은 가벼운 매커니즘으로 통신하는 작은 애플리케이션이다. 작은 서비스들은 각자의 비즈니스 기능을 담당하고 완전 자동화 된 절차에 따라 독립적으로 배포된다. 각 서비스는 서로 다른 프로그래밍 언어나 서로 다른 데이터 저장 기술을 사용할 수 있음 MSA 용어 Microservice Architecture MSA Microservices Microservices 란? 마이크로서비스는 소프트웨어가 잘 정의된 API를 통해 통신하는 소규모의 독립적인 서비스로 구성되어 있는 경우의 소프트웨어 개발을 위한.. 개발 스터디 2022. 12. 21. [Network] CIDR (Classless Inter-Domain Routing) CIDR 이란? Classless Inter-Domain Routing 'CIDR', 사이더는 IP 주소를 할당하고 패킷을 라우팅하는 방식 중 하나이며 다음과 같은 장점이 있다. 급격히 부족해지는 IPv4 주소를 보다 효율적으로 사용하게 해준다. 접두어를 이용한 주소 지정 방식을 가지는 계층적 구조를 사용함으로써 인터넷 광역 라우팅의 부담을 줄여준다. CIDR 표기법 먼저 IPv4는 아래 그림과 같이 각 1 byte 크기의 Octect 4개로 구성되어 있다. 0.0.0.0 ~ 255.255.255.255 범위의 주소 체계를 가지고 있다. 상위 2개는 네트워크 영역 구분을 위한 Network ID 를 의미한다. 하위 2개는 호스트 식별을 위한 Host ID 를 의미한다. 각 Octect 값을 10진수에서 .. 개발 스터디 2022. 12. 19. [Nginx] 차세대 경량 웹 서버 엔진엑스(Nginx)란? NGINX 엔진엑스(NGINX)는 차세대 웹서버로 불리며, 동시접속 처리에 특화된 웹 서버 프로그램이다. Apache 보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화되어 있다. 동시접속자가 약 700명 이상이라면 서버를 증설하거나 NGINX 환경을 권장한다고 한다. 현재는 Apache 시장 점유율이 가장 높지만, 아마존 웹서비스(AWS) 의 시장 점유율은 44%에 달할정도로 가볍고 성능이 좋은 엔진이라고 한다. NGINX 는 HTTP 웹 서버로 활용되기도 하고, 리버스 프록시 서버 (Reverse proxy server)로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다. NGINX (웹 서버)의 역할 웹 서버의 역할을 복습?하자면, 1. 정적 파일 처리.. Front/WebServer 2022. 12. 15. [IntelliJ] VisualVM 설치 및 인텔리제이 연동하기 VisualVM Download VisualVM Download Site VisualVM 압축파일 해제 인텔리제이 VisualVM 설치하기 Settings - Plugins - VisualVM 검색 후 Install Settings - VisualVM Launcher 설정 이동 VisualVM executable path 설정 : VisualVM 설치한 경로에 visualvm 프로그램 선택 Custom JDK home path 설정 : JDK 설치되어 있는 경로 선택 설정을 적용하고 나면 인텔리제이 상단에 다음과 같은 아이콘이 생긴것을 확인할 수 있다. 만약 바로 아이콘이 생기지 않는다면 인텔리제이를 재시작해보자. 각각 Run 과 Debug 아이콘으로 애플리케이션을 실행하면 VisualVM이 실행된다. .. IDE/IntelliJ 2022. 12. 8. [Windows] 윈도우 시간 동기화 설정하기 사실 윈도우 시간이 틀어지는 경우가 있는 지, 주기적으로 시간 동기화를 하고 있는 지 몰랐다. Springboot 기반 서비스를 스케줄러를 통해 돌리는데, 설정한 시간대로 작업을 하지 않고 불규칙적인 시간으로 작업을 하는 것을 보고도 코드 설정문제라 생각했다. 동일한 서비스를 리눅스 환경에서 돌리면 설정한 값의 시간대로 동작하는 것을 보고 윈도우의 시간설정 문제일 수 있다는 것을 의심하기 시작하면서 윈도우 시간 동기화 설정을 하게되었다. 수동으로 시간 설정하기 1. 제어판 - 시계 및 국가 선택 2. 시간 및 날짜 설정 선택 3. 날짜 및 시간 변경 클릭 4. 원하는 날짜 혹은 시간 설정후 확인 클릭 동기화를 통해 자동으로 시간 맞추기 1. 제어판 - 시계 및 국가 선택 2. 시간 및 날짜 설정 선택 3.. 운영체제 2022. 12. 1. [Java] 문자열, 객체, 배열 Null Check StringUtils org.apache.commons.lang3.StringUtils 요약 Empty : Null, 공백문자("") Blank : Null, 공백문자(""), whitespace(" ") Empty StringUtils.isEmpty : Null 혹은 공백문자("") 이면 true 값 반환 StringUtils.isNotEmpty : Null 혹은 공백문자("") 이면 false 값 반환 StringUtils.isAnyEmpty : 문자들 중 Null 혹은 공백문자("") 있을 시 true 값 반환 StringUtils.isNoneEmpty : 문자들 중 Null 혹은 공백문자("") 있을 시 false 값 반환 StringUtils.isAllEmpty : 모든 문자열들이 Null 혹은.. JVM/Java 2022. 11. 18. [SQL] Database Custom Order By (Oracle/Tibero, MySQL, PostgreSQL) 기본 정렬 방식을 떠나 특정 컬럼의 특정 값, 혹은 값의 순서를 커스텀하고 싶을 때 각 Database 마다 어떻게 사용되는 지 살펴보자 예제 컬럼 명 : COLUMN1 허용 값 : 검정, 노랑, 빨강, 파랑 Tibero / Oracle 아래 두 방법 모두 IF ELSE 문의 형태와 유사하다. CASE WHEN 문 SELECT * FROM TBL ORDER BY (CASE WHEN COLUMN1 = '빨강' THEN 1 WHEN COLUMN1 = '검정' THEN 2 WHEN COLUMN1 = '파랑' THEN 3 ELSE 4 END) ASC -- 혹은 DESC COLUMN1의 값이 빨강일 경우는 1 값으로 대체, 검정일 경우는 2 값으로 대체, 파랑일 경우는 3 값으로 대체, 나머지(노랑)일 경우 4 .. Database/SQL 2022. 11. 13. [JUnit] 소개 - 2. Assertion 과 Assumption Assertion 실제 테스트에서 검증하고자 하는 내용을 확인하는 기능 org.junit.jupiter.api.Assertions.* Method 메소드명 설명 fail 무조건 실패 assertTrue 조건이 True 이면 성공 assertFalse 조건이 False 이면 성공 assertNull 조건이 Null 이면 성공 assertNotNull 조건이 Not Null 이면 성공 assertEquals 기대값(expected) 와 실제값(actual)이 동일하면 성공 assertArrayEquals 두 Array가 동일하면 성공 assertIterableEquals 두 Iterable이 동일하면 성공 assertLinesMatch 두 Stream이 동일하면 성공 assertNotEquals 기대값(ex.. JVM/JUnit 2022. 11. 1. [JUnit] 소개 - 1. 테스트 종류와 JUnit 이란 테스트의 종류 단위 테스트 (Unit Test) - TDD 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상 동작을 검증하는 테스트 테스트 대상 단위 클래스 메소드 테스트 단위의 크기 작을수록 복잡성이 낮아지고, 테스트 활용이 더 쉬워진다. 통합 테스트 (Integration Test) 단위 테스트보다 더 큰 동작을 위해 여러 모듈을 모아 의도대로 협력하는 지 검증하는 테스트 외부 라이브러리(API, DB 등..)까지 묶어 검증할 때 사용한다. 단위 테스트보다 더 많은 코드를 테스트하기 때문에 신뢰성이 떨어진다. 또한, 에러 발생 시 확인이 쉽지 않아 유지보수가 힘들다. 인수 테스트 (Acceptance Test) 사용자 시나리오에 맞춰 수행하는 테스트 단위/통합 테스트와 달리 비즈니스에 초점을 둔다 .. JVM/JUnit 2022. 11. 1. [알고리즘] 세그먼트 트리(Segment Tree) 알고리즘 동작 원리 및 구현하기 세그먼트 트리 알고리즘 개요 세그먼트 트리 알고리즘은 트리 형태의 자료구조를 사용한다. 특정 구간 내 데이터에 대한 연산(쿼리)을 빠르게 구할 수 있는 트리 알고리즘이다. 키워드 구간 범위 시간복잡도 데이터 변경 : O(logN) 연산 : O(logN) 데이터 변경 시마다 M번 연산 : O((logN + logN) * M) = O(MlogN) 특징 누적 합을 담은 트리라고 가정하자. N = 10 (노드의 개수 : 10) 인 그림에서 노드안에 적힌 순서는 값이 아닌 각 노드의 고유 번호라고 했을 때, 각 노드가 저장하고 있는 합의 범위(구간)를 나타낸 것이다. 각 노드는 다음과 같은 의미를 가진다. 리프 노드 : 해당 노드의 값 자체 리프 노드가 아닌 노드 : 왼쪽 자식과 오른쪽 자식의 합(누적 합 예시).. Algorithm/Tree & Graph 2022. 10. 26. [MyBatis] SpringBoot MyBatis 쿼리 로그 설정하기 의존성(dependency) 추가 implementation "org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16" 프로퍼티 파일 추가 파일 : log4jdbc.log4j2.properties 경로 : src/main/resources log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator log4jdbc.dump.sql.maxlinelength=0 datasource 설정 설정 파일 : application.yml driver-class-name 추가 jdbc url 변경 : "log4jdbc:" 추가 spring: datasource: driver-class-name: net.s.. Database/MyBatis 2022. 10. 24. [IntelliJ] 프로퍼티 파일 인코딩 설정하기 IntelliJ (혹은 Eclipse) 에서 프로퍼티(properties) 파일에 한글을 작성을 할 때 "ë¹ì© ê´ë¦¬" 와 같은 괴상한 문자가 표출된다거나, 한글을 작성해서 Git에 반영을 했는데 "???" 로 표출이 되는 경우가 있다. 이는 당연히 인코딩의 문제인데, workspace 인코딩을 UTF-8 로 설정해도 프로퍼티 파일의 한글이 깨지는 경우가 있다. 확장자가 properties 파일을 따로 인코딩 설정을 해주어야한다. IntelliJ IDEA properties Encoding 설정 File - Settings - Editor - File Encodings 설정 창 들어가기 Properties Files (*.properties) 의 Default encoding for prop.. IDE/IntelliJ 2022. 10. 21. [Lombok] 자주 사용되는 Lombok Annotation 기능정리 먼저 자바 라이브러리 Lombok 다운로드 및 적용방법은 다음 게시글을 참고하자. Java 필수 라이브러리 Lombok 사용, 적용방법 Java 필수 라이브러리 Lombok 사용, 적용방법 Lombok 라이브러리는 VO(Value Object) 나 DTO(Data Transfer Object) 생성 시 혁신적으로 코드를 줄여주는 라이브러리 입니다. 얼마나 혁신적으로 코드를 줄이는지.. aljjabaegi.tistory.com @Getter, @Setter 필드에 @Getter/@Setter 을 붙이면, 해당 필드에 대한 기본 getter/setter 메소드를 생성해준다. 접근 제한자 AccessLevel @Getter/@Setter 에서의 접근 제한자 설정을 할 수 있다. 만약 생성되는 getter/se.. JVM/Java 2022. 9. 4. 자바의 빌드 시스템, Gradle Build와 IntelliJ Build 컴파일과 빌드 요즘에는 IDE가 워낙 좋아져 컴파일과 빌드의 차이를 모르는 경우가 많다.(=나) 왜냐하면 대부분 툴에서 그 둘을 동시에 Run 하나로 퉁치기 때문이다. 컴파일 : 소스의 문법을 분석해 기계어로 번역, 자바의 경우 JVM(Java Virtual Machine)에서 실행 가능한 바이트코드 형태의 클래스 파일이 생성된다. 링크 : 소스 파일이 여러 개 생성되고, 소스파일에서 각 함수를 호출하는 경우가 있으므로, 연결작업을 해주는 것을 링크라 한다. 빌드 : 빌드는 컴파일이 포함된 일종의 과정으로, 프로그래밍 된 코드를 컴파일하고 실행 가능한 결과물로 만드는 과정을 칭한다. 컴파일과 링크가 빌드 안에 포함되는 개념이라 볼 수 있다. 자바의 빌드 시스템 Maven Gradle IntelliJ Ma.. IDE/IntelliJ 2022. 9. 1. 이전 1 2 3 4 5 ··· 15 다음 추천 글 728x90 반응형