반응형
반응형

 

public String getRandomImage(HttpSession session) {

	filePath = "image\\rock_paper_scissor\\rock.JPG";
	URL resource = getClass().getClassLoader().getResource(filePath);
	filePath = resource.getFile();
    
	return filePath;
}

자바에서 파일 경로 불러올 때 경로는 webapp안에 있는 resources가 아닙니다.

 

 

<img src="/resources/image/captcha/rock_paper_scissor/scissor.JPG"/>

JSP 파일 경로를 불러올 때 경로는 webapp 안에 있는 resources입니다.

 

 

반응형
반응형

 

// File file = new File(fileImagePath); // 리사이즈할 파일 정보

public BufferedImage resize(File file, int width, int height) throws IOException {

    /** 이미지 가져오기 **/
    InputStream inputStream = new FileInputStream(file);

    /** 받은 이미지 읽기 **/
    BufferedImage inputImage = ImageIO.read(inputStream);

    /** 리사이징 **/
    BufferedImage outputImage = new BufferedImage(width, height, inputImage.getType());

    Graphics2D graphics2D = outputImage.createGraphics();
    graphics2D.drawImage(inputImage, 0, 0, width, height, null); // 그리기
    graphics2D.dispose(); // 자원해제

    return outputImage;

}

리사이징

 

public void drawBlackBox(BufferedImage blackBoxImage, int blackBoxWidth, int blackBoxHeight, HttpSession session) {

    int cutXPoint = 10; // 왼쪽 상단 X좌표
    int cutYPoint = 10; // 왼쪽 상단 Y좌표

    /** 도형 그리기 **/
    Graphics graphics = blackBoxImage.getGraphics();
    graphics.setColor(Color.BLACK); // 색상 설정
    graphics.fillRect(cutXPoint, cutYPoint, blackBoxWidth, blackBoxHeight); // 채우기 사각형
    // graphics.drawRect(cutXPoint, cutYPoint, blackBoxWidth, blackBoxHeight); // 테두리 사각형
   
    // graphics.fillOval(xPoint, yPoint, ovalWidth, ovalHeight); // 채우기 원
    // graphics.drawOval(xPoint, yPoint, ovalWidth, ovalHeight); // 테두리 원
    graphics.dispose();
}

도형 그리기

 

public BufferedImage getWhitePaper(StringImageVO customImage) {

    // 종이 크기 설정
    int width = customImage.getImageWidth();
    int height = customImage.getImageHeight();

    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
	
    // 예시
    // BufferedImage mergedImage = new BufferedImage(550, 100, BufferedImage.TYPE_INT_RGB);

    return image;
}

하얀 배경 그리기

public void draw(BufferedImage image, String question) {

    Color color = new Color(255, 0, 0); // 글자 색
    Font font = new Font("TimeRoman", Font.PLAIN, 35); // 이미지 글체
    
    // 글자 이미지가 생성될 위치 선정
    int left = 240;
    int top = 300;

    // Graphics2D 와 BufferedImage는 연동 된 느낌?
    Graphics2D graphics = image.createGraphics();

    // 글자색과 글자체 설정
    graphics.setColor(color);
    graphics.setFont(font);

    // 해당 내용으로 그리기 작업
    graphics.drawString(question, left, top);
    graphics.dispose();

}

글자 그리기

public void getQuestionList(
	HttpServletRequest request, HttpServletResponse response) throws IOException {

    /** 화면 준비 **/
    OutputStream out = response.getOutputStream();

    /** 준비된 이미지 **/
    BufferedImage img = new BufferedImage(550, 100, BufferedImage.TYPE_INT_RGB);

    /** 화면에 뿌리기 **/
    response.setContentType("image/png");
    ImageIO.write(img, "png", out);
}

화면에 노출시키기

 

BufferedImage cutImage = resizedImage.getSubimage(cutXPoint, cutYPoint, cutWidth, cutHeight); // 잘린 이미지

이미지 자르기

 

반응형
반응형
public String checkReferer(HttpServletRequest request, HttpServletResponse response) {

    String referer = request.getHeader("Referer");

    if (referer.equals(rightReferer)) return "올바른 접근";
    else return "올바르지 않은 접근";

}

HTTP 리퍼러(HTTP referer)는 웹 브라우저로 월드 와이드 웹을 서핑할 때, 하이퍼링크를 통해서 

각각의 사이트로 방문시 남는 흔적을 말한다.

예를 들어 A라는 웹 페이지에 B 사이트로 이동하는 하이퍼링크가 존재한다고 하자. 

이때 웹 사이트 이용자가 이 하이퍼링크를 클릭하게 되면 웹 브라우저에서 B 사이트로 참조 주소(리퍼러)를 전송하게 된다. 

B 사이트의 관리자는 이 전송된 리퍼러를 보고 방문객이 A 사이트를 통해 자신의 사이트에 방문한 사실을 알 수 있다.

웹 사이트의 서버 관리자가 사이트 방문객이 어떤 경로로 자신의 사이트에 방문했는지 알아볼 때 유용하게 사용된다.

하지만, 리퍼러는 조작또한 가능하기 때문에 리퍼러 정보를 사용할 때에는 보안에 항상 주의해야 한다

반응형
반응형

로깅(Logging)

  정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동.

 

System.out.print()

  하지만 이는 프로그램의 성능을 떨어트리고 로그를 파일에 저장하는 것이 불가능


java.util.logging

  외부 라이브러리 사용 없이 로깅이 가능

  다른 라이브러리와 비교했을 때 퍼포먼스 (속도) 가 느리다.

  나만의 custom 레벨을 만들면 메모리 누수가 일어난다.
  타 라이브러리에 비해 기능이 부족하다.

 

log4j

  log4j는 가장 오래된 로깅 프레임워크로써 Apache의 Java기반 로깅 프레임 워크이다.

  콘솔 및 파일 출력의 형태로 로깅을 도와주며 xml, properties로 환경을 구성할 수 있다.

  현재는 2015년 기준으로 개발이 중단되었다.

  퍼포먼스가 최적화되어있다.

  log4j2 가장 최신에 나온 로깅 프레임워크로써 Apache의 log4j의 다음 버전

 

 

SLF4J

  SLF4J(Simple Logging Facade for Java)는 이름에서 확인할 수 있듯이.

  java.util.logging, logback 및 log4j와 같은 다양한 로깅 프레임 워크에 대한 추상화(인터페이스) 역할을 하는 라이브러리

  즉 DI할 수 있게 있는 상위 인터페이스

  (slf4j를 사용하여 설정에 따라 다른 로깅 라이브러리를 사용할 수 있게 된다.)

  (slf4j 사용 후 Implementation은 logback이나 log4j2를 사용)

 

참고자료 : https://www.fwantastic.com/2019/12/javautillogging-vs-log4j-vs-slf4j.html

반응형
반응형
// base64로 인코딩한 내용 받아오기
@RequestMapping(value = "/getBase64", method = RequestMethod.GET)
public @ResponseBody String getBase64(HttpServletRequest request, HttpServletResponse response) throws Exception {

    Base6430 base = new Base6430();
    String encodeBase64 = base.encodingBase64();

    return encodeBase64;

}

// 이미지 base64 인식
//	@RequestMapping(value = "/base64", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
// mp4 base64 인식
//	@RequestMapping(value = "/base64", method = RequestMethod.GET, produces = "video/mp4")
// pdf base64 인식
//	@RequestMapping(value = "/base64", method = RequestMethod.GET, produces = "application/pdf")
// base64 디코딩해 해석해 화면에 노출
@RequestMapping(value = "/base64", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public @ResponseBody byte[] base64(HttpServletRequest request, HttpServletResponse response) throws Exception {

    String uri = "http://localhost:8080/getBase64";
    String encodeBase64 = callGetMethod(uri);

    byte decode[] = Base64.decodeBase64(encodeBase64);

    return decode;
}

StringBuffer response;
public String callGetMethod(String url) {		
    try {

        // 통신 주소  등록
        URL obj = new URL(url);

        // 통신 방식 설정
        HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
        conn.setRequestProperty("Content-Type", "application/json; charset=utf-8" );
        conn.setDoOutput(true);
        conn.setRequestMethod("GET");

        // ---- 읽어온 데이터를 담기 ----
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));

        String inputLine;
        response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

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

    // ---- 읽어온 데이터를 반환 ----
    String responseData =response.toString();
    return responseData; 
}

base64Controller

 

spring에서 제공하는 produces에 다양한 옵션이 존재하는데 ContentType 인식 시키는 방법에 대한 기술

(produces = MediaType.IMAGE_JPEG_VALUE → 이미지로 읽어라~)

 

package com.mycompany.myapp;

import java.io.File;
import java.io.FileInputStream;

import org.apache.commons.codec.binary.Base64;

public class Base6430 {

	public String encodingBase64() throws Exception {

		String strBase64 = "";
		String filePath = "D:\\dog.jpg";
//		String filePath = "D:\\test.mp4";
//		String filePath = "D:\\test.pdf";

		File f = new File(filePath);
		if (f.exists() && f.isFile() && f.length() > 0) {
			byte[] bt = new byte[(int) f.length()];
			FileInputStream fis = null;

			try {
				fis = new FileInputStream(f);
				fis.read(bt);
				strBase64 = new String(Base64.encodeBase64(bt));

			} catch (Exception e) {
				throw e;
			}
			fis.close();
			
		}
		return strBase64;
	}
}

base6430.java

 

해당 Path 정보를 읽어 Base64 인코딩하는 작업

 

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.9</version>
</dependency>

pom.xml

반응형
반응형

📝List 정렬

public void sort(){

    /** 초기 데이터 init **/
    List<String> list = Arrays.asList("banana", "apple", "cherry");

    /** 오름차순 정렬 **/
    list.sort(Comparator.naturalOrder());
    System.out.println("오름차순: " + list);
    // 오름차순: [apple, banana, cherry]

    /** 내림차순 정렬 **/
    list.sort(Comparator.reverseOrder());
    System.out.println("내림차순: " + list);
    // 내림차순: [cherry, banana, apple]

}

 

📝Map정렬

  public void sort() {

    /** 초기 데이터 init **/
    Map<String, Integer> map = new HashMap<>();
    map.put("apple", 3);
    map.put("banana", 1);
    map.put("cherry", 2);

    /** Map.Entry 리스트로 변환 **/
    List<Map.Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet());

    /** 키(key) 기준으로 오름차순 정렬 **/
    entryList.sort(Map.Entry.comparingByKey());
    System.out.println("키 기준 오름차순: " + entryList);
    // 키 기준 오름차순: [apple=3, banana=1, cherry=2]

    /** 키(key) 기준으로 내림차순 정렬 **/
    entryList.sort(Map.Entry.<String, Integer>comparingByKey().reversed());
    System.out.println("키 기준 내림차순: " + entryList);
    // 키 기준 내림차순: [cherry=2, banana=1, apple=3]

    /** 값(value) 기준으로 오름차순 정렬 **/
    entryList.sort(Map.Entry.comparingByValue());
    System.out.println("값 기준 오름차순: " + entryList);
    // 값 기준 오름차순: [banana=1, cherry=2, apple=3]

    /** 값(value) 기준으로 내림차순 정렬 **/
    entryList.sort(Map.Entry.<String, Integer>comparingByValue().reversed());
    System.out.println("값 기준 내림차순: " + entryList);
    // 값 기준 내림차순: [apple=3, cherry=2, banana=1]

  }

Map은 직접 정렬할 수 없어서 Map.Entry로 변환한 후에 List로 담아서 사용이 가능합니다.

 

📝 JSONArray 정렬

public void sort() throws JSONException {

    /** 초기 데이터 init **/
    String jsonData = "["
        + "{\"name\":\"banana\",\"price\":1},"
        + "{\"name\":\"apple\",\"price\":3},"
        + "{\"name\":\"cherry\",\"price\":2}"
        + "]";

    JSONArray jsonArray = new JSONArray(jsonData);

    /** JSONArray -> List<JSONObject> **/
    List<JSONObject> jsonList = new ArrayList<>();
    for (int i = 0; i < jsonArray.length(); i++) {
      jsonList.add(jsonArray.getJSONObject(i));
    }

    /** 오름차순 정렬 **/
    jsonList.sort(Comparator.comparing(obj -> {
      try {
        return obj.getInt("price");
      } catch (JSONException e) {
        throw new RuntimeException(e);
      }
    }));

    /** 정렬된 List -> JSONArray로 변환 **/
    JSONArray sortedJsonArray = new JSONArray(jsonList);

    System.out.println("오름차순 정렬 JSONArray: " + sortedJsonArray);
    // 오름차순 정렬 JSONArray: [{"price":1,"name":"banana"},{"price":2,"name":"cherry"},{"price":3,"name":"apple"}]

    /** 내림차순 정렬 **/
    jsonList.sort(Comparator.comparing((JSONObject obj) -> {
      try {
        return obj.getInt("price");
      } catch (JSONException e) {
        throw new RuntimeException(e);
      }
    }).reversed());

    /** 정렬된 List -> JSONArray로 변환 **/
    JSONArray descSortedJsonArray = new JSONArray(jsonList);

    System.out.println("내림차순 정렬 JSONArray: " + descSortedJsonArray);
    // 내림차순 정렬 JSONArray: [{"price":3,"name":"apple"},{"price":2,"name":"cherry"},{"price":1,"name":"banana"}]
}

JSONArray도 바로 정렬할 수 없기 때문에 List에 담아서 처리해야합니다. 정렬할 때 정렬할 키를 기준으로 return해서 그 값을 정렬처리하게끔하면 됩니다.

반응형
반응형

Arrays

  Array는 길이 고정 Array 객체를 생성한 후에는 Array의 길이를 마음대로 변경할 수 없다.

 

ArrayList

  ArrayList는 사이즈는 동적 만약 설정한 범위를 넘어 더 많은 크기가 들어오면 배열 크기를 1.5배 증가시킨다.

 

 

Arrays와 ArrayList는 요소를 추가하거나 가져올 때의 성능과 처리시간은 동일하지만 ArrayList의 경우 범위를 넘으면 1.5배 증가시키면서 시간 Resoucre와 Memory 를 더 차지하게 된다.

반응형
반응형
package my.spring.project;

public class main {

	public static void main(String[] args) {

        String s = "1000";                     
        
        int i = Integer.parseInt(s); // int 타입 변환
        long L = Long.parseLong(s);  // long 타입 변환
        float f = Float.parseFloat(s); // float 타입 변환
        double d = Double.parseDouble(s) + 1.0; // double 타입 변환
	}

}
반응형
반응형

📝mysql(8버전 이상)

Driver Class com.mysql.cj.jdbc.Driver
URL jdbc:mysql://192.168.0.67:3306/DB명?characterEncoding=UTF-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false

 

📝mariadb

Driver Class org.mariadb.jdbc.Driver"m.mysql.cj.jdbc.Driver
URL jdbc:mariadb://192.168.0.40:7001/search?servertimezone=UTC

 

반응형