반응형

자바에서 inputStream 을 String 변환하고 싶을 때 InputStreamReader 와 BufferedReader를 간편하게 변환할 수 있습니다.


예제 코드를 참조하세요.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Test {
  public static void main(String[] args) throws IOException {
    InputStream is = Test.class.getResourceAsStream("/test.txt");
    BufferedReader br = null;
    String sCurrentLine = null;
    StringBuffer sb = new StringBuffer();
    br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    while ((sCurrentLine = br.readLine()) != null) {
      sb.append(sCurrentLine);
    }
    System.out.println(sb.toString());
  }
}



반응형
반응형

java 에서 byte 단위로 substring 하고 싶을 때 참고할 만한 코드입니다.


String msg = "문자열";
int 자르고싶은크기 = 90;
byte[] bytes = msg.getBytes();
if(bytes.length > 자르고싶은크기 ) {    
  msg = new String(bytes, 0, 자르고싶은크기 );
}
System.out.println(msg);



반응형
반응형

외부 라이브러리를 이용하지 않고 java (1.8 기준) 만으로 http client (get method) 를 구현하는 코드를 공유합니다.


...
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
...
 
...
 
  public static String get(String getUrl) {
    URL url = null;
    try {
      url = new URL(getUrl);
    } catch (MalformedURLException e1) {
      throw new RuntimeException("URL형식을 확인해주세요.", e1);
    }
    HttpURLConnection con = null;
    try {
      con = (HttpURLConnection) url.openConnection();
    } catch (IOException e1) {
      throw new RuntimeException("연결 중 입출력 오류가 발생하였습니다.", e1);
    }
    try {
      con.setRequestMethod("GET");
    } catch (ProtocolException e) {
      throw new RuntimeException("연결 중 프로토콜 오류가 발생하였습니다.", e);
    }
 
    con.setRequestProperty("Content-Type""text/html");
    con.setConnectTimeout(5000); // 연결 타임아웃
    con.setReadTimeout(5000); // 읽기 타임아웃
    con.setInstanceFollowRedirects(true); // 리다이렉트 자동
 
    try {
      int status = con.getResponseCode();
      if (status != HttpURLConnection.HTTP_OK) {
        throw new RuntimeException("정상 응답 코드가 아닙니다. " + status);
      }
    } catch (IOException e) {
      throw new RuntimeException("응답을 받는 중 오류가 발생하였습니다.", e);
    }
    StringBuffer content = new StringBuffer();
    try {
      BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
      String inputLine;
      while ((inputLine = in.readLine()) != null) {
        content.append(inputLine);
      }
      in.close();
    } catch (IOException e) {
      throw new RuntimeException("응답을 읽는 중 오류가 발생하였습니다.", e);
    }
    con.disconnect();
    return content.toString();
  }
 
...



반응형
반응형

스프링부트에서 필터를 등록하는 방법입니다.



import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
 
  // ...
 
  @Bean
  public FilterRegistrationBean getFilterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(new XSSFilter());
    registrationBean.setOrder(Integer.MIN_VALUE);
    registrationBean.addUrlPatterns("/*");
    return registrationBean;
  }
 
  // ...
}



반응형
반응형

새로운 개발서버에 Tomcat을 구동하는데 엄청나게 시간이 오래 걸립니다.

시간을 잡아먹는 로그를 보니 퐉하고 감이 왔습니다.


org.apache.catalina.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [289,555] milliseconds



이 오류 메시지인데 뭔가 암호화 모듈을 불러오는데 시간이 오래 걸립니다.


추측 키워드는 바로 이겁니다. "새 서버, 자바, 암호화"


제가 전에 올렸던 아래 두 포스팅을 보면 이 현상의 원인과 해결책을 확인할 수 있습니다. 고고싱~


2017/09/09 - [java] - jdbc connection reset


2017/09/23 - [리눅스] - 리눅스 /dev/random vs /dev/urandom


반응형
반응형

spring boot application.properties custom encryption/decryption.


스프링부트 기본 프라퍼티 자체 암호화 복호화 방법을 공유합니다.


보통 jdbc 의 DB username, password를 암호화하는데 많이 사용됩니다. 


"jdbc 암호화" 라는 키워드로 검색을 해보면 아마 jasypt 오픈 소스를 이용해 암호화하는 내용들이 많이 있을겁니다.


어떤 이유에서든지 jasypt를 이용하지 않고 jdbc 암호화를 하고 싶은 분들에게 이 방법을 공유합니다.



application.properties 의 내용을 복호화하기 위한 소스입니다.

여기서는 spring.datasource.username, spring.datasource.password 이 두가지 항목에 대해서만 명시적으로 불러와서 암호화된 내용을 복호화해서 넘기고 있습니다. application.properties 의 내용은 자체암호화 모듈로 암호화한 내용을 넣어두시면 됩니다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
 
import 자체암호화모듈임포트;
 
public class EncryptionEnvironmentPostProcessor implements EnvironmentPostProcessor {
 
  Logger logger = LoggerFactory.getLogger(EncryptionEnvironmentPostProcessor.class);
 
  @Override
  public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    Properties props = new Properties();
    try {
      props.put("spring.datasource.password", 자체복호화(environment.getProperty("spring.datasource.password")));
      props.put("spring.datasource.username", 자체복호화(environment.getProperty("spring.datasource.username")));
    } catch (Exception e) {
      logger.error("datasource 복호화실패", e);
    }
    environment.getPropertySources().addFirst(new PropertiesPropertySource("myProps", props));
  }
 
}




위의 소스를 적용시키려면 클래스패스 루트에  META-INF/spring.factories를 만들어서 아래처럼 내용을 넣어주시면 됩니다.

# META-INF/spring.factories 
org.springframework.boot.env.EnvironmentPostProcessor=전체패키지.EncryptionEnvironmentPostProcessor




간단하게 DB 아이디, 패스워드를 암호화해서 프라퍼티로 저장할 수 있게 되었습니다.

반응형
반응형

이전에 스프링부트에서 기본적으로 쌓이는 spring.log 파일의 위치를 변경하는 방법에 대해서 공유했었습니다.


2017/08/22 - [java] - spring boot logback 기본 spring.log 위치 변경하기.


이번에는 spring.log 파일이 쌓이지 않도록 하는 방법을 공유합니다.


사실 매우 간단합니다. logback.xml 에서 아래 include 요소를 제거하면 됩니다.


<include resource="org/springframework/boot/logging/logback/base.xml" />



하지만 이렇게 되면 기본 CONSOLE Appender를 사용할 수 없게 됩니다.

스프링에서 설정해준 CONSOLE Appender를 사용하려면 아래 두줄을 include 하면 됩니다.


  <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  <include resource="org/springframework/boot/logging/logback/console-appender.xml" />  



반응형
반응형

2018/08/06 - [java] - gc overhead limit exceeded excel download 엑셀 대용량 쓰기


~*~*!! 위 글의 코드를 이용하세요!!.

--------------


poi 라이브러리를 이용해 엑셀 파일을 만드는 방법을 공유합니다.


먼저 라이브러리 입니다. 메이븐 기준으로 아래와 같이 지정해주시면 됩니다.


    <!-- poi -->
    <!-- xls -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.14</version>
    </dependency>
    <!-- xlsx -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.14</version>
    </dependency>
cs


엑셀 파일이 작성된 결과를 먼저 보여드립니다.

일반적으로 많이 쓰이는 테이블 형태로 병합하는 부분까지 추가해보았습니다.

그리고 헤더 부분은 배경색 및 글씨 굵기가 볼드처리 되어있습니다.




위 엑셀의 화면을 구성하기 위한 코드입니다.

정말 간단합니다. 주석 이외에 설명은 별도로 하지않겠습니다. 


  public static void main(String[] args) throws FileNotFoundException, IOException {
    ExcelUtil excel = new ExcelUtil("sheet 이름");
 
    // 시작 위치
    excel.setOffset(11);
 
    // 헤더
    excel.addRow("f8f8f8", Font.BOLDWEIGHT_BOLD, Arrays.asList("DATE""TOTAL Contacts""Browser"""""""));
    // 헤더
    excel.addRow("f8f8f8", Font.BOLDWEIGHT_BOLD, Arrays.asList("DATE""TOTAL Contacts""Chrome""Safari""IE""기타"));
 
    // 내용
    excel.addRow(Arrays.asList("2018-01-01""15""1""2""0""12"));
    excel.addRow(Arrays.asList("2018-01-02""30""16""2""0""12"));
 
    // 병합  merge(firstCol, firstRow, lastCol, lastRow)
    excel.merge(1112);// DATE
    excel.merge(2122);// TOTAL Contacts
    excel.merge(3161);// Browser
    
    File file = new File("/test/파일명.xlsx");
    excel.write(new FileOutputStream(file));
  }




ExcelUtil 전체 소스입니다. 엑셀을 읽거나 그래프를 그릴 수 있는 기능도 포함하고 있습니다.


 
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.AttributedString;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
 
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.ShapeTypes;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
public class ExcelUtil {
  private XSSFSheet sheet;
  private int rowIndex = 0;
  private int maxCols = 0;
  private XSSFWorkbook workbook;
  private int offsetCol = 0;
 
  public ExcelUtil(String sheetName) {
    workbook = new XSSFWorkbook();
    sheet = workbook.createSheet(sheetName);
  }
 
  public void setOffset(int col, int row) {
    offsetCol = col;
    rowIndex = row;
  }
 
  public void addRow(List<String> rows) {
    addRow(null, (short0, rows);
  }
 
  public void addRow(String backgroundColor, List<String> rows) {
    addRow(backgroundColor, (short0, rows);
  }
 
  public int getRowIndex() {
    return rowIndex;
  }
 
  public void setCellWidth(int cellnum, int width) {
    sheet.setColumnWidth(cellnum, width);
  }
 
  public void setCell(int cellnum, int rownum, XSSFCellStyle cellStyle, String cellValue) {
    XSSFRow row = sheet.getRow(rownum);
    if (row == null) {
      row = sheet.createRow(rownum);
    }
 
    XSSFCell cell = row.getCell(cellnum);
    if (cell == null) {
      cell = row.createCell(cellnum, XSSFCell.CELL_TYPE_STRING);
    }
    cell.setCellStyle(cellStyle);
    cell.setCellValue(cellValue);
  }
 
  public void addRow(String backgroundColor, short boldweight, List<String> cellStrings) {
    XSSFRow header = sheet.createRow(rowIndex++);
    int cellIndex = offsetCol;
    for (String value : cellStrings) {
      XSSFCell cell = header.createCell(cellIndex++, XSSFCell.CELL_TYPE_STRING);
      cell.setCellValue(value);
      cell.setCellStyle(createCellStyle(backgroundColor, boldweight));
    }
    if (maxCols < cellIndex) {
      maxCols = cellIndex;
    }
  }
 
  public void addRow(List<Map<StringString>> style, List<String> cellStrings) {
    XSSFRow header = sheet.createRow(rowIndex++);
    int cellIndex = offsetCol;
    for (String value : cellStrings) {
      int index = cellIndex - offsetCol;
      XSSFCell cell = header.createCell(cellIndex++, XSSFCell.CELL_TYPE_STRING);
      cell.setCellValue(value);
      String backgroundColor = null;
      short boldweight = 0;
      if (style.size() > index) {
        Map<StringString> styleMap = style.get(index);
        backgroundColor = styleMap.get("backgroundColor");
        if (styleMap.containsKey("boldweight")) {
          boldweight = Short.parseShort(styleMap.get("boldweight"));
        }
      }
      cell.setCellStyle(createCellStyle(backgroundColor, boldweight));
    }
    if (maxCols < cellIndex) {
      maxCols = cellIndex;
    }
  }
 
  public XSSFCellStyle createCellStyle(String backgroundColor, short boldweight) {
    XSSFCellStyle cellStyle = sheet.getWorkbook().createCellStyle();
    cellStyle.setAlignment(HorizontalAlignment.CENTER);
    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    if (backgroundColor != null) {
      cellStyle.setFillForegroundColor(new XSSFColor(hexToByteArray(backgroundColor)));
      cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
    }
    setSolidBorder(cellStyle);
 
    if (boldweight != 0) {
      Font headerFont = this.sheet.getWorkbook().createFont();
      headerFont.setBoldweight(boldweight);
      cellStyle.setFont(headerFont);
    }
    return cellStyle;
  }
 
  public void setFontHeight(int cellnum, int rownum, int height) {
    sheet.getRow(rownum).getCell(cellnum).getCellStyle().getFont().setFontHeight(height);
  }
 
  public void setCellAlignment(int cellnum, int rownum, HorizontalAlignment align) {
    sheet.getRow(rownum).getCell(cellnum).getCellStyle().setAlignment(align);
  }
 
  public void setCellWrapText(int cellnum, int rownum, boolean b) {
    XSSFRow row = sheet.getRow(rownum);
    XSSFCellStyle rowStyle = row.getRowStyle();
    if (rowStyle == null) {
      XSSFCellStyle cellStyle = sheet.getWorkbook().createCellStyle();
      cellStyle.setWrapText(b);
      row.setRowStyle(cellStyle);
    } else {
      rowStyle.setWrapText(b);
    }
    row.getCell(cellnum).getCellStyle().setWrapText(b);
  }
 
  // hex to byte[]
  public byte[] hexToByteArray(String hex) {
    if (hex == null || hex.length() == 0) {
      return null;
    }
 
    byte[] ba = new byte[hex.length() / 2];
    for (int i = 0; i < ba.length; i++) {
      ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
    }
    return ba;
  }
 
  public void setSolidBorder(XSSFCellStyle cellStyle) {
    cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
    cellStyle.setBorderTop(CellStyle.BORDER_THIN);
    cellStyle.setBorderRight(CellStyle.BORDER_THIN);
    cellStyle.setBorderLeft(CellStyle.BORDER_THIN);
  }
 
  public void write(OutputStream outputStream) throws IOException {
    // adjust column width to fit the content
    for (int i = 0; i < maxCols; i++) {
      sheet.autoSizeColumn(i);
      sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 1500);
    }
    for (int i = 0; i < offsetCol; i++) {
      setCellWidth(i, 900);
    }
    this.sheet.getWorkbook().write(outputStream);
    this.workbook.close();
  }
 
  public void merge(int firstCol, int firstRow, int lastCol, int lastRow) {
    // 셀 병합
    sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); // 병합
  }
 
  public void drawRect(int rownum, int scolnum, int ecolnum, int dx1, int dx2) {
    XSSFDrawing patriarch = sheet.createDrawingPatriarch();
    XSSFClientAnchor a = new XSSFClientAnchor();
    a.setCol1(scolnum);
    a.setRow1(rownum);
    a.setDx1(pxToEmu(dx1));
    a.setDy1(pxToEmu(5));
    a.setDx2(pxToEmu(dx2));
    a.setDy2(pxToEmu(-5));
    a.setRow2(rownum + 1);
    a.setCol2(ecolnum);
 
    XSSFSimpleShape shape1 = patriarch.createSimpleShape(a);
    shape1.setShapeType(ShapeTypes.RECT);
    int red = 0, green = 0, blue = 0;
    red = Integer.parseInt("f0"16);
    green = Integer.parseInt("ad"16);
    blue = Integer.parseInt("4e"16);
    shape1.setLineStyleColor(red, green, blue);
    shape1.setFillColor(red, green, blue);
  }
 
  public static int pxToEmu(int px) {
    return (int) Math.round(((double) px) * 72 * 20 * 635 / 96); // assume
                                                                 // 96dpi
  }
 
  public static int emuToPx(int emu) {
    return (int) Math.round(((double) emu) * 96 / 72 / 20 / 635); // assume
                                                                  // 96dpi
  }
 
  public float getDefaultRowHeightInPoints() {
    return this.sheet.getDefaultRowHeightInPoints();
  }
 
  public void setRowHeightInPoints(int rownum, float height) {
    sheet.getRow(rownum).setHeightInPoints(height);
  }
 
  public float getRowHeightInPoints(int rownum) {
    return sheet.getRow(rownum).getHeightInPoints();
  }
 
  /**
   * ROW 높이 자동 조절
   * 
   * @param rownum
   * @param cellValue
   */
  public void setAutoRowFit(int cellnum, int rownum) {
    XSSFRow row = sheet.getRow(rownum);
    XSSFCell cell = row.getCell(cellnum);
    XSSFFont cellFont = cell.getCellStyle().getFont();
    int fontStyle = java.awt.Font.PLAIN;
    if (cellFont.getBold())
      fontStyle = java.awt.Font.BOLD;
    if (cellFont.getItalic())
      fontStyle = java.awt.Font.ITALIC;
 
    java.awt.Font currFont = new java.awt.Font(cellFont.getFontName(), fontStyle, cellFont.getFontHeightInPoints());
 
    String cellText = cell.getStringCellValue();
    AttributedString attrStr = new AttributedString(cellText);
    attrStr.addAttribute(TextAttribute.FONT, currFont);
 
    // Use LineBreakMeasurer to count number of lines needed for the text
    //
    FontRenderContext frc = new FontRenderContext(nulltruetrue);
    LineBreakMeasurer measurer = new LineBreakMeasurer(attrStr.getIterator(), frc);
    int nextPos = 0;
    int lineCnt = 1;
    float columnWidthInPx = sheet.getColumnWidthInPixels(cellnum);
    while (measurer.getPosition() < cellText.length()) {
      nextPos = measurer.nextOffset(columnWidthInPx);
      lineCnt++;
      measurer.setPosition(nextPos);
    }
    int fromIndex = -1;
    while ((fromIndex = cellText.indexOf("\n", fromIndex + 1)) >= 0) {
      lineCnt++;
    }
    if (lineCnt > 1) {
      row.setHeightInPoints(
          sheet.getDefaultRowHeightInPoints() * lineCnt * /* fudge factor */ 1.1f);
    }
  }
 
  public static List<List<String>> readExcel(File file) throws IOException, InvalidFormatException {
    return readExcel(new FileInputStream(file), file.getName(), 0);
  }
 
  public static List<List<String>> readExcel(File file, int sheetAt) throws IOException, InvalidFormatException {
    return readExcel(new FileInputStream(file), file.getName(), sheetAt);
  }
 
  public static List<List<String>> readExcel(InputStream is) throws IOException, InvalidFormatException {
    return readExcel(is, "xlsx"0);
  }
 
  private static Workbook getWorkbook(InputStream inputStream, String fileName) throws IOException {
    Workbook workbook = null;
 
    if (fileName.endsWith("xlsx")) {
      workbook = new XSSFWorkbook(inputStream);
    } else if (fileName.endsWith("xls")) {
      workbook = new HSSFWorkbook(inputStream);
    } else {
      throw new IllegalArgumentException("The specified file is not Excel file");
    }
 
    return workbook;
  }
 
  public static List<List<String>> readExcel(InputStream is, String fileName, int sheetAt)
      throws IOException, InvalidFormatException {
    List<List<String>> resultList = new ArrayList<>();
    // 파일을 읽기위해 엑셀파일을 가져온다
    Workbook workbook = getWorkbook(is, fileName);
    int rowindex = 0;
    int columnindex = 0;
    // 시트 수 (첫번째에만 존재하므로 0을 준다)
    // 만약 각 시트를 읽기위해서는 FOR문을 한번더 돌려준다
    Sheet sheet = workbook.getSheetAt(sheetAt);
    // 행의 수
    int rows = sheet.getPhysicalNumberOfRows();
    for (rowindex = 0; rowindex < rows; rowindex++) {
      // 행을 읽는다
      Row row = sheet.getRow(rowindex);
      resultList.add(new ArrayList<String>());
      if (row != null) {
        // 셀의 수
        int cells = row.getPhysicalNumberOfCells();
        for (columnindex = 0; columnindex <= cells; columnindex++) {
          // 셀값을 읽는다
          Cell cell = row.getCell(columnindex);
          String value = "";
          // 셀이 빈값일경우를 위한 널체크
          if (rowindex == 0 && cell == null) {
            continue;
          }
          if (cell != null) {
            // 타입별로 내용 읽기
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_FORMULA:
              value = cell.getCellFormula();
              break;
            case Cell.CELL_TYPE_NUMERIC:
              value = String.format("%1$,.0f", cell.getNumericCellValue());
              break;
            case Cell.CELL_TYPE_STRING:
              value = cell.getStringCellValue() + "";
              break;
            case Cell.CELL_TYPE_BLANK:
              value = cell.getBooleanCellValue() + "";
              break;
            case Cell.CELL_TYPE_ERROR:
              value = cell.getErrorCellValue() + "";
              break;
            }
          }
          if ("false".equals(value)) {
            value = "";
          }
          resultList.get(rowindex).add(value);
        }
      }
    }
    workbook.close();
    return resultList;
  }
}
cs


반응형
반응형

서비스를 개발하다보면 전화번호를 다룰때가 많습니다.

집전화나 휴대폰전화 형식이 조금씩 다르고 사용자가 임의로 입력하게되면 그 형식이 또 다를수 있습니다.

그래서 보통 DB에 저장시에는 숫자만 저장하고 보여줄 때 형식에 맞게 보여줍니다.


그 형식에 맞게 보여주는 코드를 공유해봅니다.


public class FormatUtil {
 
  public static String phone(String src) {
    if (src == null) {
      return "";
    }
    if (src.length() == 8) {
      return src.replaceFirst("^([0-9]{4})([0-9]{4})$""$1-$2");
    } else if (src.length() == 12) {
      return src.replaceFirst("(^[0-9]{4})([0-9]{4})([0-9]{4})$""$1-$2-$3");
    }
    return src.replaceFirst("(^02|[0-9]{3})([0-9]{3,4})([0-9]{4})$""$1-$2-$3");
  }
 
  public static void main(String[] args) {
    System.out.println(FormatUtil.phone("01012341234"));
    System.out.println(FormatUtil.phone("0212341234"));
    System.out.println(FormatUtil.phone("03212341234"));
    System.out.println(FormatUtil.phone("0621231234"));
    System.out.println(FormatUtil.phone("0163451234"));
    System.out.println(FormatUtil.phone("#012"));
    System.out.println(FormatUtil.phone("15881588"));
    System.out.println(FormatUtil.phone("050612341234"));
  }
}




결과


010-1234-1234
02-1234-1234
032-1234-1234
062-123-1234
016-345-1234
#012
1588-1588
0506-1234-1234




정확한 스펙에 맞게하고 싶은분은 여기를 참조하셔서 직접 구현하셔도 됩니다.


링크 : 대한민국의 전화번호 체계

반응형
반응형

스프링시큐리티를 사용하면 기본적으로 헤더가 설정되는 값이 있습니다.


캐시금지, 스니프 방지, HSTS, 프레임옵션, XSS공격 방지 등이 기본적으로 설정되어있습니다.


Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
cs



캐시를 수동으로 제어하고 싶은 경우에 처리 방법입니다.

cacheControl을 빼고 나머지는 다시 설정해주는 방법입니다.


    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http.headers().defaultsDisabled().contentTypeOptions();
      http.headers().frameOptions().sameOrigin();
      http.headers().xssProtection().block(false);
      ....
    }
cs



그리고 Controller나 Interceptor 혹은 Filter에서 다음과 같이 수동으로 캐시를 설정합니다.


response.setHeader("Cache-Control""max-age=60");// 60seconds
cs


반응형

+ Recent posts