Backend/Spring

`application.properties`를 사용할 때는 `ResourceBundle.getBundle("application");` 정도만 작성해도 됐지만, .yaml(.yml) 파일 사용시에는 별도의 라이브러리를 사용해주어야 한다.build.gradleimplementation 'dev.akkinoc.util:yaml-resource-bundle:2.12.3' yaml 파일을 불러오는 부분private static ResourceBundle properties = ResourceBundle.getBundle("application", YamlResourceBundle.Control.INSTANCE);Integer port = properties.get("server.post"); // 포트 정보 조회
1. Test Code 구조 AAA Pattern & GWT Pattern Arrange : 준비 Act : 실행 Assert : 단언/검증 💡 GWT Pattern : Given - When - Then 단계를 거치는 패턴으로, AAA의 각 단계와 대응된다. 2. Assertions Assertions.assertEquals(T expected, T actual) : 값 검증 Assertions.assertThrows(T expected, Executable e) : Exception 검증 // given Double num = 0.0; // when & then Assertions.assertThrows(RuntimeException.class, () -> { Double val = 1.0; val ..
이 글은 H2 데이터베이스의 이전 버전 중 1.4.199 버전을 도커 컨테이너로 실행시키는 방법에 대한 글입니다. 가장 최신 버전을 설치하고자 하실 때에는 도커 이미지의 버전을 명시하지 않으시면 되고, 다른 이전 버전을 설치하고자 하실 때에는 버전을 달리 입력하시면 됩니다. 1) 의존성 추가 dependencies { implementation org.hibernate:hibernate-entitymanager:4.3.10.Final implementation com.h2database:h2:2.1.210 } 2) 도커를 통해 H2 설치 이미지 받기 저는 oscarfonts/h2 이미지를 받았습니다. 아래 링크는 도커 허브의 해당 이미지 주소입니다. https://hub.docker.com/r/oscar..
1. 프로젝트 생성 SpringBoot 프로젝트를 생성한 후 src 폴더와 같은 위치에 react 환경을 구성할 별도의 폴더를 만들어 여기에 create-react-app을 통해 리액트 어플리케이션을 생성했다. 이 부분까지는 아주 간단한 작업이며, 잘 정리해둔 블로그가 많으니 생략하겠다. 2. CORS(cross-origin requests) 문제 해결하기 스프링부트 서버는 localhost:8080에서 실행되고, React 서버는 localhost:3000번에서 실행된다. 이 경우에는 CORS문제가 발생하게되므로 이를 해결 하기위해 Proxy를 별도로 설정해주어야 한다. cf. 기본 컨트롤러를 Rest Controller로 설정 백엔드 서버에서는 대부분의 경우에 데이터를 JSON 형태로 전달할 것이므로..
getServletContext().getRealPath() 컨트롤러로 전달되는 HttpServletRequest의 세션(혹은 HttpSession)으로부터 서블릿 컨텍스트를 받아 getRealPath() 메소드를 통해 실제 경로를 구할 수 있다. 이는 파일 다운로드 등에도 자주 사용된다. request.getSession().getServletContext().getRealPath(); 유의 개인 프로젝트 진행 시에, 분명 서블릿 컨텍스트는 "/"로 지정되어있는 상태에서 위와 같이 경로를 구하면 임시로 톰캣이 프로젝트를 실행시키는 위치를 받아왔다. 실제 프로젝트가 위치한 경로가 안나왔다... 회사 코드에서는 위의 코드로 프로젝트가 위치한 경로가 나왔는데 이 이유를 모르겠다..!
MyBatis에서는 #{변수}, ${변수}을 사용해 해당 변수를 넘겨준 파라미터 값으로 치환할 수 있다. 이 때, 둘은 쿼리가 실행될 때 차이점을 보인다. 아래의 두 쿼리문을 보자. SELECT * FROM MOVIES WHERE MOVIENAME=#{movieName} SELECT * FROM MOVIES WHERE MOVIENAME=${movieName} 위 쿼리문을 마이바티스를 통해 실행했을 경우 실제로는 아래와 같이 실행된다. SELECT * FROM MOVIES WHERE MOVIENAME='타이타닉'; SELECT * FROM MOVIES WHERE MOVIENAME=타이타닉; 이러한 차이 때문에 동적쿼리문을 작성할 때 테이블명 혹은 컬럼명이 입력해야 하는(따옴표가 없어야 하는) 부분에는 '#..
이미지 파일(BLOB 타입)을 데이터 베이스에서 가져와 실제 이미지화하여 이를 파일로 다운로드 하기 위해선 ImageIO 클래스의 read 함수를 통해 이미지를 받아와 이를 write 함으로써 가능하다. 참고로 아래 코드 중 'png'가 들어가는 부분에는 이미지의 확장자를 넣으면 된다. String image = itemVO.getImageData(); byte[] imageBlob = Base64.getDecoder().decode(imageDataStr.split(",")[1]); String fileName = "C:\Users\Admin\Downloads\new_image.png"; BufferedImage img = ImageIO.read(imageBlob); ImageIO.write(img, ..
1. Word 파일(.docx) 1) 바이너리 파일 작성 완료 후 바이트 배열로 만들기 InputFileStream is = new InputFileStream("/filePath"); XWPFDocument doc = new XWPFDocument(is); ... ByteArrayOutputStream os = new ByteArrayOutputStream(); doc.write(os); os.close(); doc.close(); byte[] xwpfBytes = os.toByteArray(); // xwpfBytes를 DB에 넣는 작업 수행 2) DB에서 바이트 배열 가져와서 파일로 다운로드 String fileName = "document.docx"; byte[] fileBytes = mapper..
1. 워드 파일 생성 File templateFile = new File(path, templateFileName); XWPFDocument doc = new XWPFDocument(new FileInputStream(templateFile)); 2. 테이블 생성(기존 템플릿 테이블 사용 시 POIWordUtil.copyTable() 사용 가능) XWPFTable tbl = doc.createTable(); POIWordUtil.copyTable(templateTable, tbl); XWPFTable tbl = doc.createTable(); XWPFTableRow row = tbl.createRow(); // 이미 존재하는 XWPFTableRow 삽입 시 addRow() 사용 가능 XWPFTableC..
1. 테이블 생성 생성한 파워포인트 파일에 슬라이드 추가 후 슬라이드에 테이블을 생성하고 그 크기를 정할 수 있다. 테이블의 내부 셀 크기에 따라 크기가 달라지므로 이전의 이미지 삽입과 달리 시작 지점의 x좌표, y좌표만을 정해줬다. 만약 테이블 생성 시(createTable) 인자로 로우 수와 컬럼 수를 지정해준다면, 로우 추가 시에 셀을 추가하지 않아도 해당 컬럼 수 만큼 셀이 생성된다. 때문에 그럴 경우에는 row.getCells().get(컬럼 인덱스)의 방식으로 해당 셀에 접근해야 한다. (Paragraph까지는 자동으로 생성해주나. 따라서 접근한 Cell에 getParagraphs().get(idx);를 통해 Paragraph에 접근한 뒤 TextRun 역시 같은 방법으로 접근하려 하면 nul..
devYH
'Backend/Spring' 카테고리의 글 목록