자바·JSP2021. 3. 7. 17:11

Stream API는 최종 처리 단계 특정 조건을 만족하는 요소들을 얻을 수 있도록 세가지 매칭 메소드를 제공한다.


allMatch() 모든 요소들이 매개값(Predicate)으로 주어진 조건을 만족하는지 조사
anyMatch() 최소한 한 개의 요소가 주어진 조건에 만족하는지 조사
noneMatch() 모든 요소들이 주어진 조건을 만족하지 않는지 조사

public static void main(String[] args){
        int[] intArr = {2, 4, 6};

        boolean result = Arrays.stream(intArr)
                .allMatch(a -> a%2 == 0);
        System.out.println("2의 배수? " + result);

        result = Arrays.stream(intArr)
                .anyMatch(a -> a%3 == 0);
        System.out.println("3의 배수가 하나라도 있나? " + result);

        result = Arrays.stream(intArr)
                .noneMatch(a -> a%3 == 0);
        System.out.println("3의 배수가 없나? " + result);
}

2의 배수? true
3의 배수가 하나라도 있나? true
3의 배수가 없나? false

'자바·JSP' 카테고리의 다른 글

EHCache 설정하기  (0) 2020.05.31
리소스 파일 읽기  (0) 2020.04.20
자바 클래스에서 리소스 로드하기  (0) 2020.04.18
XML 파싱 예제  (0) 2020.04.11
[JAVA] OS별로 CPU정보 가져오기  (0) 2019.04.05
Posted by 미랭군
자바·JSP2020. 5. 31. 22:35

설정 순서는 아래와 같다.

- Maven Dependency 설정

- Ehcache.xml작성(ehcache 설정파일)

- CacheManager 설정 (xml)

Maven Dependency 설정

<!-- EHCache 모듈 -->
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.6</version> 
</dependency>

<!-- Spring Caching Interface -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.20.RELEASE</version>
</dependency>

<!-- EHCache Support 모듈, 다른 Caching 지원모듈 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.20.RELEASE</version>
</dependency>

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         maxBytesLocalHeap="300M" <!-- CacheManager에 의해 관리되는 캐시의 메모리를 300M로 제한 -->
         updateCheck="false">

    <!-- 임시저장 경로를 설정 -->
    <diskStore path="java.io.tmpdir" />
    <!-- 
        Cache에 저장할 레퍼런스의 최대값을 100000으로 지정,
        maxDepthExceededBehavior = "continue" :  초과 된 최대 깊이에 대해 경고하지만 크기가 조정 된 요소를 계속 탐색
        maxDepthExceededBehavior = "abort" : 순회를 중지하고 부분적으로 계산 된 크기를 즉시 반환
    -->
    <sizeOfPolicy maxDepth="100000" maxDepthExceededBehavior="continue"/>

   <!-- default Cache 설정 (반드시 선언해야 하는 Cache) -->
    <defaultCache
            eternal="false"
            timeToIdleSeconds="0"
            timeToLiveSeconds="1200"
            overflowToDisk="false"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    <!-- 사용하고자 하는 캐시 별 설정 -->
    <cache name="LocalCacheData"
           eternal="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="1200"
           overflowToDisk="false"
           diskPersistent="false"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU">
    </cache>

   <cache name="AuthMemberList"
           eternal="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="1200"
           overflowToDisk="false"
           diskPersistent="false"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU">
    </cache>
</ehcache>

CacheManager Bean 설정

<!-- Annotation 기반 캐시 사용 (@Cacheable, @CacheEvict..) -->
<cache:annotation-driven/>

<!-- EHCache 기반 CacheManager 설정 -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="ehcache"/>
</bean>

<!-- ehcache.xml 설정 로드 -->
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:config/ehcache.xml"/>
    <property name="shared" value="true"/>
</bean>
Posted by 미랭군
자바·JSP2020. 4. 20. 00:44
<test>
    <case id='1'>
        <param>100</param>
        <expected>mkyong</expected>
    </case>
    <case id='2'>
        <param>99</param>
        <expected>mkyong</expected>
    </case>
</test>
package com.test;

import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

public class ApplicationTest {

    @DisplayName("Test loading XML")
    @Test
    void loadXMLTest() {

        ClassLoader classLoader = getClass().getClassLoader();

        try (InputStream inputStream = classLoader.getResourceAsStream("xml/data.xml")) {

            String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
            System.out.println(result);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

'자바·JSP' 카테고리의 다른 글

[JAVA] Stream 매칭(allMatch(), anyMatch(), noneMatch())  (0) 2021.03.07
EHCache 설정하기  (0) 2020.05.31
자바 클래스에서 리소스 로드하기  (0) 2020.04.18
XML 파싱 예제  (0) 2020.04.11
[JAVA] OS별로 CPU정보 가져오기  (0) 2019.04.05
Posted by 미랭군
자바·JSP2020. 4. 18. 23:06

import java.io.InputStream;
import java.util.Properties;
 
public class ResourceLoadTestMain {
 
private String getResource() {
  InputStream is = getClass().getResourceAsStream("/main/resources/applicationResources.properties");
  Properties props = new Properties();
  try {
  props.load(is);
  } catch (Exception e) {
// TODO: handle exception
}
return props.get("file.target").toString();
}

public static void main(String argv[]) {
 
ResourceLoadTestMain main = new ResourceLoadTestMain ();

String[] strArr = main.getResource().split(",");
for(String str : strArr) {
System.out.println(str);
}
System.out.println();

}
}

'자바·JSP' 카테고리의 다른 글

EHCache 설정하기  (0) 2020.05.31
리소스 파일 읽기  (0) 2020.04.20
XML 파싱 예제  (0) 2020.04.11
[JAVA] OS별로 CPU정보 가져오기  (0) 2019.04.05
Apache Configuration for Java WebStart  (0) 2018.12.14
Posted by 미랭군
자바·JSP2020. 4. 11. 19:44

업무를 진행하다가 오랜만에 XML을 파싱할 일이 생겨서 예제를 만들어본다.

우선 샘플로 사용할 sample.xml이다.

<?xml version="1.0" encoding="utf-8" ?>
<in>
	<propertie name="cnt_1"></propertie>
	<record name="record_1" ref="cnt_1">
		<propertie length="1"></propertie>
		<propertie length="2"></propertie>
	</record>
	<propertie name="cnt_2"></propertie>
	<record name="record_2" ref="cnt_2">
		<propertie length="1"></propertie>
		<propertie length="2"></propertie>
		<propertie length="3"></propertie>
		<propertie length="4"></propertie>
		<propertie length="5"></propertie>
		<propertie length="6"></propertie>
	</record>
</in>

다음으로는 JAVA소스다.

 

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class XmlParsingTestMain {
 
	public static void main(String argv[]) {
 
		try {
			File file = new File("sample.xml");
			
			DocumentBuilderFactory docBuildFact = DocumentBuilderFactory.newInstance();
			DocumentBuilder docBuild = docBuildFact.newDocumentBuilder();
			Document doc = docBuild.parse(file);
			doc.getDocumentElement().normalize();
 
			System.out.println("Root element : " + doc.getDocumentElement().getNodeName());
			System.out.println();
 
			NodeList nodeList = doc.getElementsByTagName("in");
			List<Object> inList = new ArrayList<Object>();
 
			System.out.println("nodeList.getLength() ::: " + nodeList.getLength());
			
			nodeList = nodeList.item(0).getChildNodes();
			
			for (int i = 0; i < nodeList.getLength(); i++) {
 
				Node node = nodeList.item(i);
 
				System.out.println("---------- nodeList "+ i + "번째 ------------------");
				
				if (node.getNodeType() == Node.ELEMENT_NODE) {
					// node엘리먼트 
					Element element = (Element)node;
 
					// node 명
					System.out.println("node name : " + node.getNodeName());
					
					Map<String, Object> map = new HashMap<String, Object>();
					
					
					if(!element.getAttribute("name").equals("")) {
						map.put("name", element.getAttribute("name"));
					}
					
					if(!element.getAttribute("ref").equals("")) {
						map.put("ref", element.getAttribute("ref"));
					}
					
					inList.add(map);
					
					if(node.getNodeName().equals("record")) {
						NodeList dataList = node.getChildNodes();
						
						List<Map<String, Object>> inList2 = new ArrayList<Map<String, Object>>();
						
						System.out.println("dataList.getLength() ::: " + dataList.getLength());
						for (int j = 0; j < dataList.getLength(); j++) {
							Node node2 = dataList.item(j);
							if (node2.getNodeType() == Node.ELEMENT_NODE) {
								Element ele2 = (Element) node2;
								Map<String, Object> map2 = new HashMap<String, Object>();
								
								map2.put("ref", ele2.getAttribute("ref"));
								map2.put("length", ele2.getAttribute("length"));
								
								inList2.add(map2);
							}
						}
						map.put("record", inList2);
					}
				}
 
				System.out.println("---------------------------------------------");
			}
			
			System.out.println(inList);
			for(Object node : inList) {
				if(node instanceof Map) {
					System.out.println(node);
				} else if (node instanceof List) {
					List<Map<String, Object>> list = (ArrayList<Map<String, Object>>)node;
					for(Object map : list) {
						System.out.println(map);
					}
				}
			}
 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

'자바·JSP' 카테고리의 다른 글

리소스 파일 읽기  (0) 2020.04.20
자바 클래스에서 리소스 로드하기  (0) 2020.04.18
[JAVA] OS별로 CPU정보 가져오기  (0) 2019.04.05
Apache Configuration for Java WebStart  (0) 2018.12.14
POST, GET 방식 확인  (0) 2018.01.25
Posted by 미랭군
자바·JSP2019. 4. 5. 10:39

package veddan.physicalcores;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Static utility class for finding the number of physical CPU cores.
 */
public class PhysicalCores {

    private static final Logger log = LoggerFactory.getLogger(PhysicalCores.class);

    private static final String OS_NAME = getOSName();

    private PhysicalCores() { }

    /**
     * 


     * Returns the number of "physical" hardware threads available.
     * On a machien with hyper threading, this value may be less than the number
     * reported by {@link Runtime#availableProcessors()}.
     * If you are running on a virtual machine, the value returned will be the
     * number of cores assigned to the VM, not the actual number of physical
     * cores on the machine.
     * Likewise, if the number of cores available to this process is less than the
     * installed number, the available number will be returned.
     * 


     * 


     * The first call to the method may take a long time, especially on Windows.
     * Subsequent calls will return a cached value.
     * The method is threadsafe.
     * 


     * @return number of physical cores, or {@code null} if it could not be determined
     */
    public static Integer physicalCoreCount() {
        return LazyHolder.physicalCoreCount;
    }

    private static class LazyHolder {
        private static final Integer physicalCoreCount = findPhysicalCoreCount();
    }

    private static Integer findPhysicalCoreCount() {
        if (OS_NAME == null) {
            return null;
        }
        if (isLinux()) {
            return readFromProc();
        }
        if (isWindows()) {
            return readFromWMIC();
        }
        if (isMacOsX()) {
            return readFromSysctlOsX();
        }
        if (isFreeBsd()) {
            return readFromSysctlFreeBSD();
        }

        log.warn("Unknown OS \"{}\". Please report this so a case can be added.", OS_NAME);
        return null;
    }

    private static Integer readFromProc() {
        final String path = "/proc/cpuinfo";
        File cpuinfo = new File(path);
        if (!cpuinfo.exists()) {
            log.info("Old Linux without {}. Will not be able to provide core count.", path);
            return null;
        }
        try (InputStream in = new FileInputStream(cpuinfo)) {
            String s = readToString(in, Charset.forName("UTF-8"));
            // Count number of different tuples (physical id, core id) to discard hyper threading and multiple sockets  
            Map<String, Set> physicalIdToCoreId = new HashMap<>();

            int coreIdCount = 0;
            String[] split = s.split("\n");
            String latestPhysicalId = null;
            for (String row : split)
                if (row.startsWith("physical id")) {
                    latestPhysicalId = row;
                    if (physicalIdToCoreId.get(row) == null)
                        physicalIdToCoreId.put(latestPhysicalId, new HashSet());

                } else if (row.startsWith("core id"))
                    // "physical id" row should always come before "core id" row, so that physicalIdToCoreId should
                    // not be null here.
                    physicalIdToCoreId.get(latestPhysicalId).add(row);

            for (Set coreIds : physicalIdToCoreId.values())
                coreIdCount += coreIds.size();

            return coreIdCount;
        } catch (SecurityException | IOException e) {
            String msg = String.format("Error while reading %s", path);
            log.error(msg, e);
        }
        return null;
    }

    private static Integer readFromWMIC() {
        ProcessBuilder pb = new ProcessBuilder("WMIC", "/OUTPUT:STDOUT", "CPU", "Get", "/Format:List");
        pb.redirectErrorStream(true);
        Process wmicProc;
        try {
            wmicProc = pb.start();
            wmicProc.getOutputStream().close();
        } catch (IOException | SecurityException e) {
            log.error("Failed to spawn WMIC process. " +
                      "Will not be able to provide physical core count.", e);
            return null;
        }
        waitFor(wmicProc);
        try (InputStream in = wmicProc.getInputStream()) {
            String wmicOutput = readToString(in, Charset.forName("US-ASCII"));
            return parseWmicOutput(wmicOutput);
        } catch (UnsupportedEncodingException e) {
            // Java implementations are required to support US-ASCII, so this can't happen
            throw new RuntimeException(e);
        } catch (SecurityException | IOException e) {
            log.error("Error while reading WMIC output file", e);
            return null;
        }
    }

    private static Integer parseWmicOutput(String wmicOutput) {
        String[] rows = wmicOutput.split("\n");
        int coreCount = 0;
        for (String row : rows) {
            if (row.startsWith("NumberOfCores")) {
                String num = row.split("=")[1].trim();
                try {
                    coreCount += Integer.parseInt(num);
                } catch (NumberFormatException e) {
                    log.error("Unexpected output from WMIC: \"{}\". " +
                              "Will not be able to provide physical core count.", wmicOutput);
                    return null;
                }
            }
        }
        return coreCount > 0 ? coreCount : null;
    }

    private static Integer readFromSysctlOsX() {
        String result = readSysctl("hw.physicalcpu", "-n");
        if (result == null) {
            return null;
        }
        try {
            return Integer.parseInt(result);
        } catch (NumberFormatException e) {
            log.error("sysctl returned something that was not a number: \"{}\"", result);
            return null;
        }
    }

    private static Integer readFromSysctlFreeBSD() {
        String result = readSysctl("dev.cpu");
        if (result == null) {
            return null;
        }
        Set cpuLocations = new HashSet<>();
        for (String row : result.split("\n")) {
            if (row.contains("location")) {
                cpuLocations.add(row.split("\\\\")[1]);
            }
        }
        return cpuLocations.isEmpty() ? null : cpuLocations.size();
    }

    private static String readSysctl(String variable, String... options) {
        List command = new ArrayList<>();
        command.add("sysctl");
        command.addAll(Arrays.asList(options));
        command.add(variable);
        ProcessBuilder pb = new ProcessBuilder(command);
        pb.redirectErrorStream(true);
        Process sysctlProc;
        try {
            sysctlProc = pb.start();
        } catch (IOException | SecurityException e) {
            log.error("Failed to spawn sysctl process. " +
                      "Will not be able to provide physical core count.", e);
            return null;
        }
        String result;
        try {
            result = readToString(sysctlProc.getInputStream(), Charset.forName("UTF-8")).trim();
        } catch (UnsupportedEncodingException e) {
            // Java implementations are required to support UTF-8, so this can't happen
            throw new RuntimeException(e);
        } catch (IOException e) {
            log.error("Error while reading from sysctl process", e);
            return null;
        }
        int exitStatus = waitFor(sysctlProc);
        if (exitStatus != 0) {
            log.error("Could not read sysctl variable {}. Exit status was {}", variable, exitStatus);
            return null;
        }
        return result;
    }

    private static boolean isLinux() {
        return OS_NAME.startsWith("Linux") || OS_NAME.startsWith("LINUX");
    }

    private static boolean isWindows() {
        return OS_NAME.startsWith("Windows");
    }

    private static boolean isMacOsX() {
        return OS_NAME.startsWith("Max OS X");
    }

    private static boolean isFreeBsd() {
        return OS_NAME.startsWith("FreeBSD");
    }

    private static String getOSName() {
        String name = getSystemProperty("os.name");
        if (name == null) {
            log.error("Failed to read OS name. " +
                      "Will not be able to provide physical core count.");
        }
        return name;
    }

    private static String getSystemProperty(String property) {
        try {
            return System.getProperty(property);
        } catch (SecurityException e) {
            String msg = String.format("Could not read system property \"%s\"", property);
            log.error(msg, e);
            return null;
        }
    }

    private static String readToString(InputStream in, Charset charset) throws IOException {
        try (InputStreamReader reader = new InputStreamReader(in , charset)) {
            StringWriter sw = new StringWriter();
            char[] buf = new char[10000];
            while (reader.read(buf) != -1) {
                sw.write(buf);
            }
            return sw.toString();
        }
    }

    private static int waitFor(Process proc) {
        try {
            return proc.waitFor();
        } catch (InterruptedException e) {
            log.warn("Interrupted while waiting for process", e);
            return 1;
        }
    }
}

 

출처: https://github.com/veddan/java-physical-cores/blob/master/src/main/java/veddan/physicalcores/PhysicalCores.java

'자바·JSP' 카테고리의 다른 글

자바 클래스에서 리소스 로드하기  (0) 2020.04.18
XML 파싱 예제  (0) 2020.04.11
Apache Configuration for Java WebStart  (0) 2018.12.14
POST, GET 방식 확인  (0) 2018.01.25
원리금 균등 분할 상환 계산  (0) 2017.12.20
Posted by 미랭군
자바·JSP2018. 12. 14. 11:16

Apache Configuration for Java WebStart

Additional AddTypes required for Apache to send the correct Mime-Type for Java WebStart (jnlp) files.


httpd.conf

Add the following entries to the apache httpd.conf



AddType application/x-java-jnlp-file .jnlp

AddType application/x-java-archive .jar

AddType application/x-java-archive-diff .jardiff


Apache will then send the correct mime-type to the browser and therefore Java will be started when the jnlp file is clicked on.

'자바·JSP' 카테고리의 다른 글

XML 파싱 예제  (0) 2020.04.11
[JAVA] OS별로 CPU정보 가져오기  (0) 2019.04.05
POST, GET 방식 확인  (0) 2018.01.25
원리금 균등 분할 상환 계산  (0) 2017.12.20
두 IP사이의 IP 모두 출력하기  (0) 2015.10.20
Posted by 미랭군
자바·JSP2018. 1. 25. 15:39

java 단에 jsp 에서 값을 넘겨줄때 POST 방식인지 , GET 방식인지 확인 하는 메소드

request.getMethod() 함수를 이용해서 찍어보면 (request 는 HttpServletRequest 클래스의 객체)
GET 인지 ,  POST 인지 확인 할 수 있다.

request.getMethod().equals("GET") 일 경우 GET 으로 넘어오는 경우엔 true 를 반환하고
request.getMethod().equals("POST") 일 경우 POST 로 넘어오는 경우엔 true를 반환 하겠죠.. ^^

SQL Injection 관련하여 알아본 결과,
URL 인증우회로  GET 방식일 경우 취약 하므로  jsp 에서 POST 방식으로 submit() 해 주는 것이 좋다.
 

아니면 java 단에서 권한 체크를 해 주어야 한다.


'자바·JSP' 카테고리의 다른 글

[JAVA] OS별로 CPU정보 가져오기  (0) 2019.04.05
Apache Configuration for Java WebStart  (0) 2018.12.14
원리금 균등 분할 상환 계산  (0) 2017.12.20
두 IP사이의 IP 모두 출력하기  (0) 2015.10.20
jsoup 사용 예제  (0) 2015.05.29
Posted by 미랭군
자바·JSP2017. 12. 20. 01:29

public class TestMain {

public static void main(String[] args) {

// TODO Auto-generated method stub

double profit = 3.5; //연이율

double month = 240;

double amount = 240000000;

double rate = profit / 100 / 12;

double denaminator = Math.pow((1 + rate), month) - 1;

double result = (rate + (rate / denaminator)) * amount;

System.out.println(result);

}


}



Posted by 미랭군
자바·JSP2015. 10. 20. 13:12

package getIpList;

public class IpConverter {

public static void main(String[] args) {

IpConverter obj = new IpConverter();

String ip1 = "192.168.1.100";

String ip2 = "192.168.2.255";

final long from = obj.ipToLong(ip1);

final long to = obj.ipToLong(ip2);

if(from > to) {

System.out.println("시작IP는 끝IP보다 값이 작아야 합니다.");

return;

}

for (long i = from; i <= to; i++) {

   System.out.println(obj.longToIp(i));

}

}

public long ipToLong(String ipAddress) {

// ipAddressInArray[0] = 192

String[] ipAddressInArray = ipAddress.split("\\.");

long result = 0;

for (int i = 0; i < ipAddressInArray.length; i++) {

int power = 3 - i;

int ip = Integer.parseInt(ipAddressInArray[i]);

// 1. 192 * 256^3

// 2. 168 * 256^2

// 3. 1 * 256^1

// 4. 2 * 256^0

result += ip * Math.pow(256, power);


}

return result;

}

public String longToIp(long i) {

return ((i >> 24) & 0xFF) + 

                   "." + ((i >> 16) & 0xFF) + 

                   "." + ((i >> 8) & 0xFF) + 

                   "." + (i & 0xFF);

}

}

Posted by 미랭군