반응형

의존성 추가

dependencies {

    implementation 'org.apache.poi:poi:3.15'
    implementation 'org.apache.poi:poi-ooxml:3.15'
    implementation 'commons-io:commons-io:2.4'

}

 

열이 세 개인 파일을 읽으려 한다.

 

excel 읽는 메소드

public JSONArray readExcel(MultipartFile excelFile) {
        JSONArray jsonArray = new JSONArray();
        
        try{
            XSSFWorkbook workbook = new XSSFWorkbook(excelFile.getInputStream());
            XSSFSheet sheet;
            XSSFRow curRow;
            XSSFCell curCell;
            
            /////////첫번째 시트 읽기
            sheet = workbook.getSheetAt(0);
            
            /////////행의 개수 
            int rownum = sheet.getLastRowNum();
            
            /////////첫 행은 컬럼명이므로 두번째 행인 index1부터 읽기
            for(int rowIndex=1;rowIndex<=rownum;rowIndex++){
            
                /////////현재 index의 행 읽기
                curRow = sheet.getRow(rowIndex);
                
                /////////현재 행의 cell 개수
                int cellnum = curRow.getLastCellNum();
                
                /////////엑셀 데이터를 넣을 json object
                JSONObject data = new JSONObject();
                
                for(int cellIndex =0; cellIndex<cellnum;cellIndex++){
                    System.out.println(rowIndex+"행 "+cellIndex+"열의 값 : " + curRow.getCell(cellIndex));
                    switch(cellIndex){
                        case 0 : {    /////////첫번째 열 값
                            data.put("번호",curRow.getCell(cellIndex).getStringCellValue());
                        };break;
                        case 1 : {    /////////두번째 열 값
                            data.put("이름",curRow.getCell(cellIndex).getStringCellValue());
                        };break;
                        case 2 : {    /////////세번째 열 값
                            data.put("주소",curRow.getCell(cellIndex).getStringCellValue());
                        }break;
                    }
                }

                jsonArray.add(data);
            }
            return jsonArray;
        }catch(Exception e){
            System.out.println("ERROR : "  + e);
            return jsonArray;
        }
    }

 

반응형
반응형

최고의 양고기 집..

말이 필요없다.

양고기를 부위별로 즐길 수 있다는 건 정말 최고의 강점이다. 

양 한마리를 시켰다. 2명이 먹기에 충분.

 

두 번에 걸쳐 나눠 주신다.

첫번째 판. 왼쪽이 양갈비 오른쪽이 양등심.

 

사장님이 구워주신다... 

저 사이드로 나오는 적갈색 양념장이 양고기와 정말 잘 어울림

콩나물&파 무침도 정말 맛있음.

 

어떻게 이렇게 맛있는지..

양고기 좋아하는 사람이면 눈까뒤집고 먹을 맛임. 또먹고싶당 

 

두 번째 판. 왼쪽이 양 목살, 오른쪽이 삼겹살.

 

버섯과 양파구운것을 곁들여 먹으면 천국이 따로없음. 

 

삼겹살은 지방이 많아 바싹 구워야 한다고 하셨다.

지방이 많아서 그런지 양 냄새가 정말 진하고 강력하다.

양고기 냄새를 좋아하는 나는 삼겹살이 제일 좋았음.

양고기 냄새를 부담스러워 한다면 삼겹살은 먹기 힘들것이라고 생각.

 

 

온면도 시켰당. 무난히 존맛.

 

안양역에서 한 10분정도 걸어가야댐

반응형
반응형

산후 우울증, 산후 정신증을 겪은 어느 엄마의 1인칭 기록이다.

남편을 만나기 전의 이야기, 남편을 만나고 결혼하기까지의 이야기, 아이를 낳았던 이야기, 그리고 점점 정신이 병들어가는 이야기, 정신병동에서의 이야기, 회복하는 과정등을 담담히 서술해 놓았다.

엄마가 된다는 느낌은 어떤것인지, 사회가 엄마라는 존재를 어떻게 그리고 있는가를 알 수 있다.

 

작가는 한국계 미국인인데, 부모님, 시부모님 모두 한국인이다... 한국문화를 어느정도 따르는 모습이 보이는데,

내가 평소에 지양했던, 별로 좋지 않다고 생각했던 기성세대들의 한국문화가 보이며,

그런 것들로 인해 작가가 정신적으로 벼랑으로 내몰리고, 정신적으로 힘들어지는 것을 볼 수 있었다.

그래서인지 기성세대들이 답습해온 한국문화나 한국인의 정 같은것에 대한 부정적인 편견이 강화되었다....

 

아무쪼록 본인의 이야기를 서술해 놓은 거라 어렵지 않게 읽을 수 있었고, 

본인이 어떤 감정을 느꼈고, 어떤 생각들을 했었는지 잘 전달이 되었다.

주인공 본인에게 독이 되어 자신을 파괴한 것, 하지만 본인을 수렁에서 건져준 것, 그리고 본인이 좇고자 하는 건 결국 다 같은 것이라는 생각이 들었으며,

가족, 사랑, 모성애라는 건 어떻게 이루어지는 건가하는 생각이 든다.

내가 경험해보지 못한 삶의 단면을 책으로 읽어보고 생각해볼 수 있다는 점이 참 좋았다.

 

 


 

 

그의 집은 늘 시끌벅적했다. 대화와 고함으로 정신이 없었다.

막내였던 그는 한번도 제대로 말을 꺼내볼 기회가 없었다. 혼돈 자체였다.

그는 이런 소란스러움을 사랑했지만,

한편으로는 고요함을 갈망했다.

 

-

 

출산 후 내 몸을 되찾을 수 있을 거라고 생각했는데 그 대신 이제 생명을 유지하기 위한 도구가 되고 말았다.

나의 육체는 단지 주기 위해, 새 생명체에 영양분을 공급하기 위해 존재했다.

소모되는 것 이상이었다. 내 몸과 정신은 모두 케이토에게 맞추어져 있었다.

이런 모호한 시간속에서 나는 내게 이름이 있다는 생각을 멈추었다.

나는 몸일 뿐이었다. 

 

-

 

사람들이 계속해서 나를 더듬고 찔러대고 아기와 피부를 맞대라고 말하는 통에 나는 결국 옷을 벗고 아기를 가슴에 안은 채 침대에 앉았다.

아기를 위해 존재하는, 하라는 대로 하는 포유동물처럼 느껴졌다. 

 

-

 

그의 부모님은 진심으로 한 말이었다.

그러나 내가 서서히 깨닫게 된 사실이 있었는데,

이들이 자신들의 말이 진심으로 받아들여질 거라고 생각하지 않는다는 것이었다.

이들은 듣지 않는 상대에게 말하는 것에 익숙했다.

말은 그저 소리일 뿐 신중하게 선택되지 않았다. 

 

-

 

시아버지와 시어머니가 나를 바라보고 우리의 눈이 마주쳤던 그 순간에 너무나 많은 정보를 처리해야 했다.

그리고 나는 시간에서 분리되어 우리를, 우리의 초상화를, 거울을 보듯 닮은 행동을 보았다.

우리는 모두 존재했지만 서로 화합하지 못했고, 과거의 패턴을 반복했다.

 

-

 

그 말은 사랑의 승리에 대한 경고였다.

너무나 아름답고 가공되지 않은 무언가는 끝이 나게 마련이기 때문이다.

마음을 터놓는 것은 괴로움과 취약함을 알게 되는 것이다.

그것은 파괴적인 힘이다.

죽을 운명과 실패를 알지만 그럼에도 벼랑 끝에서 발을 떼는 것.

이것이 사랑을 아름답게 만들어준다.

 

-

 

모든 위대한 사랑 이야기가 지니고 있는 희망.

그는 해피엔딩을 믿었을 것이다.

자신을 힘껏 내던져 정상에 오를 수 있게 해주는 조용한 희망 말이다.

그런 다음에 깨닫게 괸다. 그곳이 정상이라는 것을.

결말을 신경 쓰지 않는, 결말은 중요하지 않음을 아는 정상이다. 이것이 행복한 결말이다.

순간만으로도, 사랑만으로도 충분할 때 그 지점에 다다른다.

 

-

 

나는 나의 아기에게 기다려달라고 말했다.

내가 돌아올 때까지 기다려달라고 부탁했다.

그리고 내가 온전해지기를 기다리는 동안 아기와 함께하는 순간들에서 기쁨을 찾았다.

아기의 웃음소리를 들었고, 첫 걸음마를 시작했을 때 손뼉을 쳤으며, 나를 향해 손을 뻗었을 때 그 손을 잡아주었다.

나는 내가 붙잡아야 하는 소중한 순간들을 찾았다. 

 

반응형

'' 카테고리의 다른 글

매일 인문학 공부 - 김종원  (2) 2021.11.03
포르노랜드 - 게일 다인스  (0) 2021.10.14
체공녀 강주룡 - 박서련  (0) 2021.07.13
천 개의 파랑 - 천선란  (0) 2021.07.06
날씨가 좋으면 찾아가겠어요 - 이도우  (0) 2021.05.29
반응형

1. CDN 추가

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.15.5/xlsx.full.min.js"></script>

 

2. 엑셀 읽는 함수 소스

document.getElementById("serialFile").onchange = function(){
	const file = event.target.files[0];
	const reader = new FileReader();
	reader.onload = () => {
		const data = reader.result;
		const workBook = XLSX.read(data, { type: 'binary' });
		//workBook.SheetNames : 엑셀파일의 시트이름이 배열로 담김
		workBook.SheetNames.forEach(sheetName => {
			//row : 엑셀의 한 행이 json으로 추출됨
			const row = XLSX.utils.sheet_to_json(workBook.Sheets[sheetName]);
		})
	};
	reader.readAsBinaryString(file);
}

 

 

반응형
반응형

jar 파일 실행시 spring의 환경설정을 변경하게 해줌.

 

application.properties의 내용 중 profiles.active의 값

java 실행 명령어 입력 시

application.properties의 내용 중 profiles > active의 값을 변경할 경우

옵션을 다음과 같이 준다.

-Dspring.profiles.active = local

 

예시

//active 할 profile 설정
java -jar -Dspring.profiles.active=dev ./test.jar

//springApplication의 프로퍼티설정파일의 이름을 변경
java -jar myproject.jar --spring.config.name=myproject

//프로퍼티설정파일의 경로를 명시하여 특정 파일을 참조하게 한다.
java -jar -Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties

//classpath가 붙으면 jar 안에 있는 resources 디렉토리를 기준으로 경로가 생성됨.
//classpath가 없는 경우는 외부에 파일이 있어서 절대경로를 명시한 경우임.

 

 


Dspring 및 spring 환경설정 관련하여 참조할 수 있는 페이지

 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

 

 

[Spring Boot] 외부에서 설정 주입하기 - Increment

4.2. 외부에서 설정 주입하기 Spring boot 애플리케이션의 설정 값을 외부에서 전달하는 방법을 다룹니다. 기준 버전은 2.2x입니다. Spring Boot는 동일한 애플리케이션 코드를 다른 환경에서 작업할 수

www.latera.kr

 

반응형
반응형

datepicker에 필요한 파일

// jquery.js, jquery-ui.css , jquery-ui.js
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>

 

 

datepicker 기본 세팅(세팅 후 dom에 붙이는 경우)

//datepicker의 기본옵션을 설정
$.datepicker.setDefaults({
  //날짜 포맷, 실제 데이터 포맷은 yyyy/mm/dd
  dateFormat: "yy/mm/dd",
  
  //prev 아이콘 마우스오버 표시 텍스트
  prevText: "이전 달",
  
  //next 아이콘 마우스오버 표시 텍스트
  nextText: "다음 달",	
  
  //달력에 표시될 월 이름
  monthNames: ["1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월",],
  
  //요일 이름(html상 dom title이 되는 듯)
  dayNames: ["일", "월", "화", "수", "목", "금", "토"],
  
  //달력에 표시될 요일 이름
  dayNamesMin: ["일", "월", "화", "수", "목", "금", "토"],
  
  //달력에서 연-월 순으로 표시되게 함
  showMonthAfterYear: true,
  
  //달력에서 yyyy뒤에 붙일 단위
  yearSuffix: "년",
  
  //선택 가능한 최소 날짜
  minDate: "2021/07/12",
  
  //선택 가능한 최대 날짜
  maxDate: "2021/08/12",
  
  //월이 텍스트가 아니라 드랍박스(select)형태로 나옴
  changeMonth: true,
  
  //changeMonth를 사용하는 경우 표시될 월 이름 약자
  monthNamesShort: ["1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월",],
  
  //년도가 텍스트가 아니라 드랍박스(select)형태로 나옴
  changeYear: true,
  
  //달력 밑에 버튼 표출 여부. 오늘 날짜 설정하는 today 버튼과 완료(done)버튼이 표시가 됨.
  showButtonPanel : treu,
  
  //날짜가 선택되면 호출될 함수
  onSelect: function (dateText) {
    console.log(dateText)
  },
  
  //년이나 월 변경시에 호출될 함수
  onChangeMonthYear : function (year,month){
    console.log(year + '년 ' + month);
  },
  
  //달력이 표시되기 전에 호출될 함수
  beforeShow: function () {
    alert("날짜 선택");
  },
});

 

dom 객체에 datepicker 붙이기 

$("#startDt").datepicker();
$("#endDt").datepicker();

 

세팅과 동시에 dom에 붙이는 방법도 있다.

$("#endDt").datepicker({
    dateFormat: "yy/mm/dd",
    onSelect: function (dateText) {
    },
}).datepicker("setDate",new Date());

 

 

메소드 사용하기

// 메소드 기본 사용 형태
$( ".selector" ).datepicker( "메소드이름", 파라미터);
//달력에 표시할 기본 날짜를 지정하는 메소드
$( ".selector" ).datepicker( "setDate", new Date());
$( ".selector" ).datepicker( "setDate", "2021/08/11");

//옵션을 설정하는 메소드
 $("#endDt").datepicker("option", {
        minDate: "2021/07/11",
        beforeShow: function () {
		},
 });

 

반응형
반응형

자바스크립트 에러 확인

in promise : fetch 구문에서 응답인 promise 쪽에서 에러 난 것

Unexpected token < in JSON : 대상을 JSON으로 파싱 중 < 를 발견, 즉 대상이 제대로 된 JSON 형식이 아니란 소리

 

에러난 api 호출 코드(fetch)

fetch("https://test.com:8080/api/test", {
    method: "POST",
    credentials: "include",
    headers: {
      "Content-Type": "application/json",
    },
    redirect: "follow",
    referrer: "no-referrer",
    body: JSON.stringify(obj),
  })
    .then((response) => response.json())
    .then(function (res) {
    });

응답을 처리하는 response.json()에서 에러가 났다. response가 json 형태가 아닌가보다.

response.json() : 응답을 JSON 형태로 파싱함

 

response를 확인해보자

F12 > Network > api 재요청(새로고침) > api 이름 선택 > Response 확인

Response가 json 형태가 아니다.

그래서 에러남.

응답이 잘 오도록 코드 수정. . . 

반응형
반응형

RequestEntity

springframework에서 제공하는 HttpEntity 의 상속클래스.

url 요청을 보낼 때 사용. responseEntity랑 짝꿍임

header, body, method, url, type을 생성자 파라미터로 넘길 수 있다. 

 

RequestEntity 사용 예시

//header 생성
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);
headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");

//url 생성
URI url = URI.create("https://https://mchch.tistory.com/");

//requestEntity 생성(방법1)
//header, method, url 을 파라미터로 하여 생성자 호출
RequestEntity<String> req1 = new RequestEntity<>(headers, HttpMethod.GET, url);

//body 생성
String body = "test"

//requestEntity 생성(방법2)
RequestEntity<String> req2 = RequestEntity.post(new URI("https://https://mchch.tistory.com/"))
                                          .accept(MediaType.APPLICATION_JSON)
                                          .body(body);

 


RestTemplate

exchange 메소드를 사용해서 http 요청을 보내고

ResponseEntity 객체를 return 받는다

url, method, requestEntity, responseType 을 생성자 파라미터로 넘길 수 있다. 

 

RestTemplate 의 exchange 사용 예시

RestTemplate restTemplate = new RestTemplate();

//RequestEntity와 responseType을 파라미터로 명시함
//ResponseEntity를 리턴받음
ResponseEntity<String> res = restTemplate.exchange(req, String.class);

 


ResponseEntity

springframework에서 제공하는 HttpEntity 의 상속클래스.

url 요청에 응답할 때 사용

body, header, status를 생성자 파라미터로 넘길 수 있다. 

 

ResponseEntity 사용 예시 1

RestTemplate template = new RestTemplate();
//getForEntity : 요청한 URL 주소로 HTTP GET 요청을 보내고,  ResponseEntity를 반환받음
ResponseEntity<String> entity = template.getForEntity("https://example.com", String.class);

//body 추출
String body = entity.getBody();
//헤더부의 contentType 추출
MediaType contentType = entity.getHeaders().getContentType();
//statusCode 추출
HttpStatus statusCode = entity.getStatusCode();

 

 

ResponseEntity 사용 예시 2

 

response Entity를 API url 호출에 대한 응답으로 사용할 수도 있음

//응답 message, 상태코드를 담은 response entity 생성
ResponseEntity<> response1 = new ResponseEntity<>("success", HttpStatus.OK);

//헤더 생성
MultiValueMap<String, String> header = new LinkedMultiValueMap<>();
header.add("Accept", MediaType.APPLICATION_JSON_VALUE);
header.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");

//응답 헤더, 상태코드를 담은 response entity 생성
ResponseEntity<> response2 = new ResponseEntity<>(header,  HttpStatus.SERVICE_UNAVAILABLE);

//상태코드는 필수
ResponseEntity<> response3 = new ResponseEntity<>(HttpStatus.OK);



///////////////////////////API 호출, ResponseEntity반환 예시//////////////////

public ResponseEntity<?> Download(String type, String category){
	try{
		return new ResponseEntity<>("성공", HttpStatus.OK);
	}catch(NullPointerException e){
		return new ResponseEntity<>("데이터가 없습니다.", HttpStatus.SERVICE_UNAVAILABLE);
	}	
}
반응형
반응형

존재하는 테이블인데 쿼리에서 인식 못하는 경우 

 

TEST 라는 이름의 테이블. TEST1이라는 컬럼이 있음 (모두 대문자)

이름이 대문자인경우 ""를 붙여줘야한다.

""를 붙여주면 대소문자를 구분

안 붙이면 대소문자 구분 안 함.

select * from TEST;  --> ERROR
select * from "TEST"; --> SUCCESS
select * from "test"; --> ERROR

select TEST1 from "TEST"; --> ERROR
select "TEST1" from "TEST"; --> SUCCESS

 

 

반응형
반응형
let content = null;
let xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "/static/file/파일이름", false);
xmlhttp.send();
//파일 로드 성공 시 파일에서 읽은 텍스트를 content에 담음
if (xmlhttp.status == 200) { 
  content = xmlhttp.responseText;
}
console.log(content);
반응형

+ Recent posts