728x90
반응형
728x90
반응형

안녕하세요.

톰캣 캐시 부족 현상 해결하기에 대해 알아보겠습니다.

저의 증상은 이미 실행 중인 서비스내 로그가 많이 쌓이는 현상이었습니다.

  • 로그
27-Oct-2022 18:39:59.062 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.webresources.Cache.backgroundProcess The background cache eviction process was unable to free [10] percent of the cache for Context [/tomcat/repository] - consider increasing the maximum size of the cache. After eviction approximately [17,482] KB of data remained in the cache.
27-Oct-2022 18:40:09.063 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.webresources.Cache.backgroundProcess The background cache eviction process was unable to free [10] percent of the cache for Context [/tomcat/repository] - consider increasing the maximum size of the cache. After eviction approximately [17,482] KB of data remained in the cache.

로그가 10초마다 쌓이는 현상이었으며 저는 단순 재기동으로 증상이 해결되었습니다.

구글링 해보니 서비스 시작시 로그가 발생한 경우 톰캣 context.xml파일에 아래 설정값을 추가해주면 된다고 하니 참고해주면 될 것 같습니다.

파일위치 : /톰캣설치경로/conf/context.xml

<Resources cachingAllowed="true" cacheMaxSize="100000"/>

 

728x90
반응형
728x90
반응형

안녕하세요 

아파치 버전 확인하는 방법에 대해 알아보겠습니다.

1. httpd 파일이 있는 경로로 이동

 : cd /apache/apahce24/bin

2. 아파치 버전 확인 명령어 입력

 : ./httpd -v 

 

728x90
반응형
728x90
반응형

프로그래머스 > 월간 코드 챌린지 시즌1 > 내적 문제풀이 공유드립니다.

https://school.programmers.co.kr/learn/courses/30/lessons/70128

  • 문제
문제 설명
길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)
제한사항
  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.
입출력 예

입출력 예 설명
입출력 예 #1
  • a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.
입출력 예 #2
  • a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.
  • 풀이
class Solution {
    public int solution(int[] a, int[] b) {
        int answer = 0;
        int[] c = new int[a.length];
        for(int i=0; i<a.length; i++){
            c[i] = a[i] * b[i];
            answer += c[i];
        }
        return answer;
    }
}
728x90
반응형
728x90
반응형

프로그래머스 > 월간 코드 챌린지 시즌2 > 음양 더하기 문제 풀이 공유드립니다.

https://school.programmers.co.kr/learn/courses/30/lessons/76501

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 문제
문제 설명
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
제한사항
  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.
입출력 예

입출력 예 설명
입출력 예 #1
  • signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
  • 따라서 세 수의 합인 9를 return 해야 합니다.
입출력 예 #2
  • signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
  • 따라서 세 수의 합인 0을 return 해야 합니다.
 
  • 풀이
class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        for(int i=0; i<absolutes.length; i++){
            if(!signs[i]){
                absolutes[i] = -absolutes[i];
            }
            answer += absolutes[i];
        }
        return answer;
    }
    
}
728x90
반응형
728x90
반응형

프로그래머스 > 연습탐욕법(Greedy) > 체육복 자바 문제 풀이 공유드립니다.

https://school.programmers.co.kr/learn/courses/30/lessons/42862

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 문제
문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한사항
  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
입출력 예

입출력 예 설명
예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.

예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.

문제가 잘 안풀린다면😢힌트가 필요한가요? [코딩테스트 연습 힌트 모음집]으로 오세요! → 클릭
출처
※ 공지 - 2019년 2월 18일 지문이 리뉴얼되었습니다.
※ 공지 - 2019년 2월 27일, 28일 테스트케이스가 추가되었습니다.
※ 공지 - 2021년 7월 28일 테스트케이스가 추가되었습니다.
※ 공지 - 2021년 8월 30일 테스트케이스가 추가되었습니다.
  • 풀이
    public static int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        //여벌 체육복을 가져온 학생이 도난당한 경우
        for(int i=0; i<lost.length; i++) {
        	for(int j=0; j<reserve.length; j++) {
        		if(lost[i] == reserve[j]) {
        			answer++;
        			lost[i] = -1;
        			reserve[j] = -1;
        			break;
        		}
        	}
        }
        // 도난당한 학생에게 체육복을 빌려주는 경우
        for(int i=0; i<lost.length; i++) {
        	for(int j=0; j<reserve.length; j++) {
        		//여벌 체육복을 가져온 학생이 자기번호 앞, 뒤 학생에게 체육복을 빌려줌
        		if((lost[i]-1 == reserve[j]) || (lost[i]+1 == reserve[j])){
        			answer++;
        			reserve[j] = -1;
        			break;
        		}
        	}
        }
        
        return answer; 
    }
	
	public static void main(String[] args) {
		int a = 5;
		int[] a2 = {2, 4};
		int[] a3 = {1, 3, 5};
		System.out.println(solution(a, a2, a3));
		
		int b = 5;
		int[] b2 = {2, 4};
		int[] b3 = {3};
		System.out.println(solution(b, b2, b3));

		int c = 3;
		int[] c2 = {3};
		int[] c3 = {1};
		System.out.println(solution(c, c2, c3));

	}
728x90
반응형
728x90
반응형

프로그래머스 2022 KAKAO BLIND 테스트 문제였던 "신고 결과 받기" 자바 문제 풀이 공유드립니다.

https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 문제
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.



각 유저별로 신고당한 횟수는 다음과 같습니다.

위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.


따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
제한사항
  • 2 ≤ id_list의 길이 ≤ 1,000
    • 1 ≤ id_list의 원소 길이 ≤ 10
    • id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
    • id_list에는 같은 아이디가 중복해서 들어있지 않습니다.
  • 1 ≤ report의 길이 ≤ 200,000
    • 3 ≤ report의 원소 길이 ≤ 21
    • report의 원소는 "이용자id 신고한id"형태의 문자열입니다.
    • 예를 들어 "muzi frodo"의 경우 "muzi"가 "frodo"를 신고했다는 의미입니다.
    • id는 알파벳 소문자로만 이루어져 있습니다.
    • 이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.
    • 자기 자신을 신고하는 경우는 없습니다.
  • 1 ≤ k ≤ 200, k는 자연수입니다.
  • return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.




입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.
입출력 예 #2
"ryan"이 "con"을 4번 신고했으나, 주어진 조건에 따라 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리합니다. 따라서 "con"은 1회 신고당했습니다. 3번 이상 신고당한 이용자는 없으며, "con"과 "ryan"은 결과 메일을 받지 않습니다. 따라서 [0, 0]을 return 합니다.
  • 풀이

중복 신고를 제거하기 위해서 HashMap과 HashSet을 사용했습니다.

  • Set : 데이터를 중복 저장할 수 없음
  • HashSet : Set 인터페이스를 사용, 중복된 값을 저장할 수 없음, put() 메소드를 사용해 데이터를 저장
  • HashMap : Map 인터페이스를 사용, 중복된 값을 저장할 수 있음, add() 메소드를 사용해 데이터를 저장
package algorithms;

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

/*
 * 코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT >신고 결과 받기
 */
public class S12 {
	
	public static int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        
        //동일한 유저ID에 대한 신고횟수는 1회로 처리하기 때문에 중복을 허용하지 않는 HashSet을 value로 사용.
        Map<String, HashSet<String>> reportMap = new HashMap<>(); // [신고한ID, [신고된ID]]
        Map<String, Integer> answerMap = new HashMap<>(); // [신고된ID, 메일수]
        
        //1. reportMap, answerMap 초기화
        for(int i=0; i<id_list.length; i++) {
        	HashSet<String> reportingId = new HashSet<>();
        	reportMap.put(id_list[i], reportingId); // 유저ID, 신고한ID로 초기 셋팅
        	answerMap.put(id_list[i], 0); // 유저ID, 메일수 0으로 셋팅 
        }
        //System.out.println("reportMap : " + reportMap ); // {muzi=[], neo=[], frodo=[], apeach=[]}
        //System.out.println("answerMap : " + answerMap ); // {muzi=0, neo=0, frodo=0, apeach=0}
        
        //2. [신고한ID, [신고된ID]]으로 reportMap 맵에 추가.
        for(int i=0; i<report.length; i++) {
        	String[] reportArr = report[i].split(" ");
        	String userId = reportArr[0]; //신고한ID
        	String reportId = reportArr[1]; //신고된ID
        	reportMap.get(reportId).add(userId);//신고된ID를 key값으로 신고한ID 배열을 value로 셋팅
        }
        //System.out.println("reportMap " + reportMap); // reportMap {muzi=[apeach], neo=[muzi, frodo], frodo=[muzi, apeach], apeach=[]}
       

        //3. 유저가 받은 이용 정지 결과 메일 셋팅
        for(String reportId : reportMap.keySet()) { // reportId는 신고된 유저ID
        	HashSet<String> userMailSend = reportMap.get(reportId); // userMailSend는 신고된유저ID(reportId)를 신고한 유저ID
//        	System.out.println("reportId: "+ reportId+ " userMailSend: " + userMailSend + " userMailSend.size(): "+userMailSend.size());
//        	reportId: muzi userMailSend: [apeach] userMailSend.size(): 1
//        	reportId: neo userMailSend: [muzi, frodo] userMailSend.size(): 2
//        	reportId: frodo userMailSend: [muzi, apeach] userMailSend.size(): 2
//        	reportId: apeach userMailSend: [] userMailSend.size(): 0
        	
        	//신고된 횟수가 K번 이상인 경우
        	if(userMailSend.size()>=k) {
        		for(String userId : userMailSend) {
        			//answerMap에 신고된Id별로 메일 수 넣기
        			answerMap.put(userId, answerMap.get(userId)+1);
        		}
        	}
//        	System.out.println("answerMap: " +answerMap);
//        	answerMap: {muzi=0, neo=0, frodo=0, apeach=0}
//        	answerMap: {muzi=1, neo=0, frodo=1, apeach=0}
//        	answerMap: {muzi=2, neo=0, frodo=1, apeach=1}
//        	answerMap: {muzi=2, neo=0, frodo=1, apeach=1}
        }
        
        // 4. id_list별 받은 메일수 answer에 셋팅
        for(int i=0; i<id_list.length; i++) {
        	answer[i] = answerMap.get(id_list[i]);
        }
        
        return answer;
    }
	

	 
	public static void main(String[] args) {
		String[] id_list = {"muzi", "frodo", "apeach", "neo"};
		String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
		int k = 2;
		
		String[] id_list2 = {"con", "ryan"};
		String[] report2 = {"ryan con", "ryan con", "ryan con", "ryan con"};
		int k2 = 2;
		
		System.out.println(Arrays.toString(solution(id_list, report, k)));
		System.out.println(Arrays.toString(solution(id_list2, report2, k2)));
	}

}
  • 실행결과

728x90
반응형
728x90
반응형

STS에서 Gradle 프로젝트를 생성하였습니다.

 

Gradle에서 자바 라이브러리 추가하는 방법에 대해 알아보겠습니다.

 

1. build.gradle에서 자바 라이브러리 추가 

 : 추가하고 싶은 자바 라이브러리를 build.gradle에 추가해주시면 됩니다.

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' //쿼리 파라미터 로그 남기게 해주는 라이브러리
}

 

2. 추가한 프로젝트 우클릭 -> Gradle -> Refresh Gradle Project

3. Porject and External Dependencies 에서 추가된 라이브러리 확인.

 

4. 라이브러리 확인

 : JUnit 실행하여 테스트시 쿼리 로그가 정상적으로 출력됨

"참고: 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하 게 사용해도 된다. 하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다"

728x90
반응형

'프로그래밍 > Spring Boot' 카테고리의 다른 글

STS Lombok 적용하기  (1) 2022.01.02
gradle 프로젝트 import하기  (1) 2021.12.28
728x90
반응형

STS에서 Lombok 적용하는 방법에 대해 알아보겠습니다.

 

* lombok이란?

자바 라이브러리로 개발자들에게 Getter/Setter 메소드, toString() 또는 생성자 함수를 생성하는 작업이 필요합니다.

이러한 작업은 반복적으로 필요하기 때문에 개발의 생산성을 높이고자 Lombok으로 단순 반복 작업을 하지 않아도 되어 개발 시간을 단축할 수 있습니다.

코딩 과정에서 롬복과 관련된 어노테이션만 보이고 getter,setter 등의 생략되지만 실제로 컴파일된 결과물 .class 파일에는 코드가 생성되어 있음을 확인할 수 있습니다.

 

STS Lombok을 적용해보겠습니다.

1. Lombok 라이브러리 설치 https://projectlombok.org/ 

 

Project Lombok

 

projectlombok.org

2. Download 클릭

3. 다운받은 lombok.jar 실행

Specify location... 클릭 -> 설치된 STS경로 추가 -> Install / Update

4. 설치완료

정상적으로 설치되었는지 확인해보겠습니다.

1. STS 실행

2. Hello.java 생성 후 실행 시 정상 출력.

///////////////////////////////////////////////////////////////////////////////
package jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class Hello {
	private String data;
}

///////////////////////////////////////////////////////////////////////////////

package jpabook.jpashop;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class JpashopApplication {
	public static void main(String[] args) {
		Hello h = new Hello();
		h.setData("helloooo");
		String data = h.getData();
		System.out.println("Data: " + h);
        
		SpringApplication.run(JpashopApplication.class, args);
	}

}
728x90
반응형

'프로그래밍 > Spring Boot' 카테고리의 다른 글

STS Gradle 라이브러리 추가하기  (1) 2022.01.02
gradle 프로젝트 import하기  (1) 2021.12.28
728x90
반응형

+ Recent posts