반응형

전체 글 428

애드센스 광고 크롤러 오류(호스팅 서버 과부하) 해결하기

티스토리에 포스팅을 올리고 난 이후에도 해당 글이 잘 노출이 되는지, 이상은 없는지 가끔 확인을 하는데요. 최근에 어느 정도 유입이 되는 글임에도 불구하고 애드센스 광고가 나오지 않는 경우가 자주 발생되고 있어 아쉬운 마음에 해결 방법을 찾던 중 추가로 '광고 크롤러 오류: 호스팅 서버 과부하' 문제를 발견하여 정리한 내용입니다. 자세한 내용을 살펴보니 '크롤러: 호스팅 서버 과부하' 문제가 발생한 페이지는 2건으로 최근인 22년 10월 1일 발견되었습니다. 해당되는 두 페이지 외에도 광고가 안 나오는 페이지들이 여러 개 존재했기 때문에 광고가 나오지 않는 근본적인 원인은 아니었지만 그래도 문제를 해결하기 위한 방법을 살펴봤는데요. 결론을 먼저 말씀드리자면, 크롤러 오류: 호스팅 서버 과부하 문제를 해결..

IT Info 2022.10.05

Spring Boot 부트스트랩(bootstrap) 템플릿 적용하는 방법

Spring Boot MVC 패턴 프로젝트에서 부트스트랩(bootstrap) 템플릿을 적용하며 정리한 내용입니다. 해당 내용은 아래 타임리프 레이아웃(Thymeleaf layout)을 적용한 상태에서 추가된 내용이기 때문에 함께 내용 참고하시면 좋을 것 같습니다. Spring Boot 타임리프 Thymeleaf layout 적용하는 방법 타임리프(Thymeleaf)에 대해서 간단하게, 타임리프는 서버 사이드 템플릿 엔진(Template Engine)의 한 종류로, 쉽게 컨트롤러가 전달하는 데이터를 이용하여 동적으로 화면을 구성할 수 있게 해주는 역 wildeveloperetrain.tistory.com *** You don't need to put the layout:fragment/data-layout..

JPA @OneToOne 일대일 연관 관계 정리 및 LazyLoding 이슈

JPA를 사용하면서도 연관 관계 매핑을 쓰지 않다가 이번 프로젝트에서 연관 관계를 적용하기 시작하며 정리한 내용이며, JPA 연관 관계 매핑 중에서 1:1 연관 관계인 @OneToOne에 대해 정리한 내용입니다. @OneToOne 일대다(1:N), 다대일(N:1) 관계에서는 다(N) 쪽이 항상 외래 키를 가지고 있지만, 일대일(1:1) 관계에서는 주 테이블이나 대상이 되는 테이블 양쪽 모두 외래 키를 가질 수 있습니다. 때문에 일대일 관계를 적용할 때는 주 테이블과 대상이 되는 테이블, 어느 쪽에 외래 키를 둘지 선택해야 하는데요. JPA에서는 외래 키를 갖는 쪽이 연관 관계의 주인이 되고, 연관 관계의 주인이 데이터베이스 연관 관계와 매핑되어 외래 키를 관리(등록, 수정, 삭제)할 수 있기 때문에 해당..

Programming/Java 2022.10.02

아이폰 스팸 문자 차단하는 방법(어플 설치 x)

올해 들어 불법 대출이나 주식, 코인, 로또 당첨번호를 알려준다는 문자까지 각종 스팸 문자가 특히 더 많이 오는 것 같은데요. 실제로 방송통신위원회와 한국인터넷진흥원이 발표한 2022년 상반기 스팸 유통현황에서도 음성 스팸은 지난해 대비 줄었지만, 문자 스팸은 더 늘었다는 결과를 볼 수 있습니다. /* 음성 스팸 메시지는 942만 건으로 지난해 하반기 대비 20.3%(240만 건) 줄었지만, 문자 스팸은 799만 건으로 26%(165만 건) 늘었다. */ 스팸 문자란, '스팸 문자'는 메시징 시스템을 이용해서 불특정 다수에게 마케팅을 목적으로 원치 않는 메시지를 보내는 것을 의미하는데요. 요즘은 많은 사람들이 연락을 할 때 카카오톡을 쓰기 때문에 문자가 오는 경우는 대부분 스팸인 경우가 많습니다. 스팸 ..

IT Info 2022.10.02

Java Enum 활용하기1 - AttributeConverter

Java Enum을 활용한 방법 중 첫 번째, AttributeConverter 인터페이스를 구현한 CustomConverter를 만들어 DB에는 Enum의 legacyCode 값으로 데이터를 저장하고, Java에서는 DB에 legacyCode 값으로 저장된 데이터를 다시 Enum으로 변환해서 사용하는 방법입니다. AttributeConverter의 기본적인 사용 방법 예시 @Getter public enum UserState { NORMAL("정상", 1), SUSPENSION("정지", 2), WITHDRAWAL("탈퇴", 3); private String desc; private Integer legacyCode; UserState(String desc, Integer legacyCode) { th..

Programming/Java 2022.10.01

Spring Boot Multi Module Project 생성하기(maven)

멀티 모듈 프로젝트는 무엇인지, Spring boot에서 multi-module project를 생성하는 방법(maven)은 어떻게 되는지 정리한 내용입니다. 참고 자료 및 코드의 git 주소는 포스팅 맨 하단에 있으며, 잘못된 내용은 댓글로 남겨주시면 확인하여 수정하겠습니다. 감사합니다. 1. Multi Module Project를 적용하는 이유 작은 단위에서부터 시작된 대부분의 프로젝트들은 시간이 지날수록 기능이 추가되면서 점점 더 커지고 복잡해지는데요. 기능이 많아지고, 요청이 많아질수록 그 요청들을 하나의 프로그램에서 처리하기가 어려워지는데, 때문에 하나로 운영하던 서비스가 클라이언트 서비스와 운영 시스템으로 나뉘는 등의 분리가 일어나게 됩니다. 이렇게 프로그램이 나누어졌을 때의 가장 큰 문제점은..

루프백 ip란? (127.0.0.1 / localhost)

루프백(Loopback) ip란? 루프백 ip, 루프백 주소는 네트워크상에서 자신을 나타내는 가상적인 주소이며, 자신에게 다시 네트워크 입력이 들어온다고 하여 루프백(Loopback) 주소라고 합니다. IPv4에서의 루프백 주소는 127.0.0.1이며, IPv6에서는 ::1 (0:0:0:0:0:0:0:1의 약자)로 사용됩니다. /* IPv4의 경우 Loopback ip는 127.0.0.0부터 127.255.255.255까지의 범위가 할당되지만, 일부 운영체제가 정확히 127.0.0.1을 사용하기 때문에 대부분 해당 주소를 사용하며, IPv6의 경우 ::1 단 하나의 주소만 사용합니다. */ 127.0.0.1 대신 localhost를 사용하는 경우도 있는데요. 로컬 호스트(localhost)는 컴퓨터 네트..

Programming/Web 2022.09.19

디앱(DApp)이란? 블록체인 디앱 개념 정리

회사에서 블록체인 관련 대화를 듣다가 web3.js라는 생소한 개념을 접하게 되어 찾아보던 중, 디앱(DApp)이라는 또 다른 개념을 접하게 되어 정리한 내용입니다. 디앱이란? '디앱(DApp) 또는 댑'이라고 하며, Decentralized Application의 약자로 탈중앙화 된 블록체인 플랫폼을 기반으로 작동하는 어플리케이션을 말합니다. 탈중앙화라는 개념은 블록체인이 등장하며 자주 접해볼 수 있었는데요. 기존의 중앙화 어플리케이션은 어플리케이션과 서버가 통신하며 중앙 서버의 데이터베이스에 데이터를 저장하고 운용하는 반면, 디앱은 중앙 서버가 존재하지 않으며, 중앙 서버의 역할을 블록체인 네트워크가 대신하게 됩니다. 때문에 기존의 중앙 서버에서 관리하던 데이터를 블록체인 네트워크에 참가하는 각각의 ..

BlockChain 2022.09.16

좀비 프로세스 원인과 죽이는 방법(Zombie Process)

개발서버를 운영하는 중에 "There are 2 zombie processes."라는 메시지를 발견했는데요. 리눅스 운영체제에서 발생할 수 있는 좀비 프로세스의 원인은 무엇인지, 죽이는 방법은 무엇인지 해결하며 정리한 내용입니다. 1. Zombie Process란? 프로세스가 종료되고 리소스는 모두 회수되었지만, 시스템 프로세스 테이블에 남아있는 defunct 상태의 프로세스를 '좀비 프로세스'라고 하는데요. 실행이 종료되었지만 아직 삭제되지 않은 프로세스라고 볼 수 있습니다. 2. 발생 원인 보통 프로세스는 exit() 시스템 함수를 호출함으로써 운영체제에게 자신의 삭제를 요청하며 종료되는데요. Process가 종료되면 사용하던 리소스는 운영체제에게 다시 회수됩니다. 그러나 이때 프로세스의 종료 상태가..

Programming/Linux 2022.09.14

mac 앱 실행 안됨 - EXC_CRASH (SIGABRT), EXC_CORPSE_NOTIFY

금일 이때까지 잘 사용하던 영상 편집 프로그램 DaVinci Resolve 17이 갑자기 실행되지 않는 문제가 발생하였습니다. (정확하게는 프로그램이 켜지는 과정에서 종료되고 프로젝트 창까지 가지 못하는 현상) 최근에 오랜만에 소프트웨어를 업데이트했는데 그게 원인일 수도 있겠다는 생각은 했는데요. 그래도 오류를 어떻게 해결해야 할지 모르겠어서 다빈치 리졸브 프로그램 자체를 새로 까는 과정을 몇 번 했으나, 계속 같은 부분에서 프로그램이 실행되지 못하고 종료되었습니다. (이전 버전은 기억이 안 나지만, 현재 버전은 macOS Monterey 12.5.1 버전입니다.) 결국 오류 내용을 찾기 위해 콘솔.app 충돌 리포트를 확인했는데, 아래와 같은 부분을 확인할 수 있었습니다. Crashed Thread: ..

IT Info 2022.09.09

Java 정규표현식 사용하기(Regular Expression)

일반적으로 클라이언트로부터 입력되는 데이터에 대한 validation은 프론트엔드에서 먼저 처리됩니다. 하지만 악의적인 의도로 프론트를 거치지 않고 유효성에 대한 검사가 이뤄지지 않은 데이터를 서버에 직접 보내게 된다면 문제가 발생할 수 있는데요. 때문에 서버 역시 들어오는 데이터에 대한 validation 처리가 필요한 것입니다. 1. 정규표현식(Regular Expression)이란? 정규식은 프로젝트 개발에 있어서 빠지지 않고 사용되는 부분으로 "특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어"라고도 표현되는데요. 정규표현식은 이메일, 휴대폰 번호, 주민번호 등의 형식이나 비밀번호 같이 입력값이 정해진 형식에 맞는지 검증해야 할 때 유용하게 사용됩니다. 정규표현식을 사용할 때 이..

Programming/Java 2022.09.07

SpringBoot form-data list object (객체 리스트 받는 방법)

스프링 부트에서 form-data 형식으로 데이터를 받는 과정 중, 리스트 형식의 객체를 받는 방법을 정리한 내용입니다. 해당 방법 외 다른 방법이 있는지가 궁금하여 찾아봤는데, 아직까지 발견하지 못했습니다. 혹시 해당 내용이 아닌 다른 방법을 아신다면 내용 댓글이나 링크 남겨주시면 참고하겠습니다. 미리 감사드립니다. 1. 사용자 정의 객체 리스트가 아닌 일반적인 리스트 받는 방법 @PostMapping("") public void formDataArrayListTest(@RequestParam(name = "name") List nameList) { //출력 nameList.stream().forEach(name -> System.out.println("name : " + name)); } 먼저 복잡한..

LocalDate 해당 월의 마지막 날짜 구하는 방법

JDK1.8부터 기존의 Calendar 클래스와 Date 클래스를 보안하기 위해 java.time 패키지가 등장했고, 해당 패키지에는 날짜와 시간을 나타내는 클래스들이 있는데요. 그중에서 날짜 정보를 나타내는 LocalDate를 사용할 때 해당 월의 마지막 날짜를 구해야 하는 경우가 있는데, 해당 방법을 정리한 내용입니다. //기준일자 LocalDate date = LocalDate.parse("2022-09-04"); //해당 월의 첫째 날 LocalDate firstDate = date.withDayOfMonth(1); // 2022-09-01 //해당 월의 마지막 날 LocalDate lastDate = date.withDayOfMonth(date.lengthOfMonth()); // 2022-09..

Programming/Java 2022.09.04

BCrypt 동작원리 파헤치기(BCryptPasswordEncoder)

BCrypt 암호화를 사용하면서 내부적으로 랜덤 한 salt가 생기고, 그에 따른 결과 해시 값이 매번 바뀌는 것을 확인하며 동작 원리가 궁금해서 찾아본 내용입니다. BCrypt 암호화는 무엇인지? 동작원리는 무엇인지? Java 코드를 통해 살펴보겠습니다. BCrypt란? BCrypt는 블로피시(Blowfish) 암호에 기반을 둔 암호화 해시 함수로 현재까지 사용 중인 가장 강력한 해시 메커니즘 중 하나이며, 1999년 USENIX에서 발표되었습니다. BCrypt는 패스워드를 해싱할 때 내부적으로 랜덤 한 salt를 생성하기 때문에 같은 문자열에 대해서 매번 다른 해싱 결과를 반환하는데요. (하지만 해싱 결과로 반환되는 String의 길이는 매번 60으로 동일합니다.) 이처럼 salt가 통합된 형식으로 ..

Programming/Web 2022.09.04

Querydsl 서브쿼리 사용하는 방법(select절, where절)

'Querydsl 서브 쿼리 사용법'에 대해 간단하게 정리한 내용입니다. Querydsl이 나오게 된 배경을 살펴보고 이어서 subquery를 적용하는 코드 예시가 있는데요. Querydsl의 경우 다른 것 보다 사용하기 위한 설정이 조금 번거로울 수 있는데, 환경설정 및 DTO 조회 방법, 페이징 처리 등의 추가적인 내용이 담긴 글 또한 해당 포스팅 맨 하단에 링크되어 있으니 필요시 참고해주시면 될 것 같습니다. Querydsl이 나오게 된 배경 Spring Data JPA에서 기본적으로 제공해주는 CRUD 쿼리 메서드로 해결하지 못하는 복잡한 쿼리나 동적 쿼리를 처리하기 위해서 JPQL을 작성하게 되는데요. /* JPQP(Java Persistence Query Language) JPQL은 테이블이 ..

반응형