precious-value의 등록된 링크

 precious-value로 등록된 티스토리 포스트 수는 49건입니다.

[Bat] 배치 파일로 간단하게 JDK 버전 전환하기! [내부링크]

글을 쓰게 된 계기 평소 사용하던 JDK 버전은 1.8인데 지오서버를 세팅하면서 JDK 11으로 변경해야 할 일이 생김. 매번 환경변수를 수정할 수 없기에 BAT 파일을 만들어 환경변수에 등록하고 간단한 명령어로 JDK 버전을 바꿀 수 있도록 하고자 글을 작성함. 1. 배치 파일 작성 배치 파일을 작성하기 전!! 당연히 사용할 Open JDK는 환경변수로 등록이 되어 있어야 함!! 혹시 아직 설정을 못했다면 2024.04.04 - [개발자 모드/개념] - [Java] Open JDK 설치 및 환경 변수 설정 [Java] Open JDK 설치 및 환경 변수 설정 글을 쓰게 된 계기 Java를 사용하면서 환경변수 설정은 필수적이기에 기초 환경 세팅 방법을 복기하고자 글을 작성함. # JDK란? JDK..

[Java] Open JDK 설치 및 환경 변수 설정 [내부링크]

글을 쓰게 된 계기 Java를 사용하면서 환경변수 설정은 필수적이기에 기초 환경 세팅 방법을 복기하고자 글을 작성함. # JDK란? JDK(Java Development Kit)는 Java 언어로 소프트웨어를 개발하는 데 필요한 도구들을 제공하는 개발 키트입니다. 1. Open JDK 설치 Open JDK도 종류가 다양한데 그 중 오라클에서 제공하는 Open JDK를 설치하였음. https://jdk.java.net/java-se-ri/11-MR2 Java Platform, Standard Edition 11 Reference Implementations Java Platform, Standard Edition 11 Reference Implementations The official Referenc..

[백엔드 아키텍처] 계층 구조 vs 도메인 구조에 대한 고민 [내부링크]

1. 글을 쓰게 된 계기 프로젝트를 진행하면서 백엔드 서버 구축 업무를 맡았고, 당연하게 아키텍처에 대한 고민이 생겼음. 어떤 식으로 아키텍쳐 구조를 만들어야 개발하는 입장에서도 접근하기 쉽고 추후 유지보수에서 프로세스를 파악하기 쉬울까... 하는 생각과 행동에 대한 정리를 해보겠음. # 잠깐! 계층 구조와 도메인 구조의 장단점 알고가기 1. 계층 구조 * 장점 - 패키지 구조만 보고 전체적인 구조를 파악하기 쉽기 때문에 작은 프로젝트나 도메인 개수가 적을 때 사용 - 예를 들어 서비스 로직에 대한 기능 수정이 있을 땐 서비스 패키지만 확인하면 됨. > 해당되는 패키지만 확인 * 단점 - 한 패키지 안의 클래스 파일들이 많이 모이게 되어 복잡해지고 관리하기 힘들어짐. - 추후 기능 수정으로 인한 모듈 단..

DB 조회는 최소한으로! [내부링크]

글을 쓰게 된 계기(문제 발견) 프로젝트 진행 중 저번에 만들었던 엑셀 다운로드 기능으로 다운로드 테스트를 했음. 그런데!! 건수가 2만 건 정도 되는데 10초 넘게 걸림. 이건 문제가 있다고 판단하여 속도 개선을 위해 어느 부분에서 시간이 오래 걸리는지 디버깅 모드에서 찾아봄. 확인 결과 엑셀을 만들고 데이터를 세팅하는데 시간이 오래 걸린 게 아니라 엑셀 만들기 전에 데이터를 변환하는 과정이 있었는데 그 과정에서 문제가 있었음. 해결과정 데이터 변환 로직(일부) //기존 코드 Field[] fields = target.getClass().getDeclaredFields(); for (Field field : fields ) { field.setAccessible(true); //접근 권한 ..

[Python] ChatGPT를 사용한 파이썬 스크립트 작성 [내부링크]

글을 쓰게 된 계기 신규 프로젝트 진행 중 VO를 만드는데 필드를 하나하나 선언하는 게 너무 비효율적이라 생각되어서 ChatGPT를 사용해 파이썬 스크립트를 작성하여 반복 업무를 줄이고자 함. 1. 환경 세팅 파이썬 스크립트이기 때문에 파이썬은 당연히 설치되어 있어야 함. 그리고 필자는 vsCode를 사용하였음. 혹시 안되어있다면.. https://www.google.com/search?q=vscode+%ED%8C%8C%EC%9D%B4%EC%8D%AC+%EC%84%A4%EC%B9%98&oq=&gs_lcrp=EgZjaHJvbWUqCQgBECMYJxjqAjIJCAAQIxgnGOoCMgkIARAjGCcY6gIyCQgCECMYJxjqAjIJCAMQIxgnGOoCMgkIBBAjGCcY6gIyCQgFECMYJxj..

[CORS] Axios 응답 객체에 Content-Disposition 누락 이슈 해결 [내부링크]

글을 쓰게 된 계기 진행 중인 프로젝트 간단한 스펙 설명 - Spring Boot - TypeScript - Mybatis 엑셀 기능 개발 중 Axios 응답 객체에서 Content-Disposition을 찾을 수 없는 문제가 발생함. 분명히 아래 코드와 같이 서버단에서 응답 헤더에 파일명을 설정을 했는데 //파일명 인코딩 String encodedFilename = URLEncoder.encode(tblName+"목록","UTF-8"); //헤더에 파일명 세팅 response.setHeader("content-disposition", "attachment; filename=\"" + encodedFilename + ".xlsx\""); //콘텐츠 타입 설정 response.setContentType(..

[Mybatis] Pageable로 페이지 처리하기 [내부링크]

글을 쓰게 된 계기 이번에 새로 개발 중인 웹 사이트는 개발 시간 단축을 위해 기존 시스템처럼 Mybatis를 사용하여 데이터를 조회함. 그런데 JPA로는 Pageable을 사용해 페이징 처리를 해보았지만, Mybatis는 해보지 않았음. 혹시 될 수도 있지 않을까 궁금해서 Page 타입에 Mybatis로 가져온 데이터를 넣어보았지만 당연히 에러가 남. 바로 갓글에 검색 ~ c 참조 사이트에 친절하게 설명되어 있지만 한번 더 숙지하기 위해 이 글을 작성함. 참고로 view 단 페이징은 이번 포스팅에서는 제외하고 back 단 구현만 포스팅함. 틀린 점 있다면 dm 말고 댓글로 말씀 부탁드림. 챕터 1. pom.xml에 의존성 추가 Spring Data에서 제공하는 Pageable을 사용하려면 라이브..

톰켓(Tomcat) Log 종류 [내부링크]

이번에 서버세팅을 하면서 톰캣 logs 폴더 안에 로그 종류가 여러 개 있는 걸 봤는데 해당 로그가 무얼 찍고 있는지 잘 몰라서 정리해봄. 필자는 리눅스에서 Tomcat 9 환경을 세팅했음. 톰캣 로그 종류 1. catalina.out - 톰켓 실행 시 catalina.sh에 의해 생성되는 로그파일로써, 서버 상 발생한 모든 내용을 기록함. - 톰캣이 기동되어 있는 동안에는 단 하나의 파일에 계속 내용이 추가되는데 별도의 설정이 없으면 파일의 크기가 무한정 증가하게 됨. 2. catalina.yyyy-mm-dd.log - 톰켓 서버 기동, 정지, 서비스의 개시, 정지정보(tomcat 자체에 관한) - 톰켓에서 생성하는 로그만 기록 3. host-manager.log - Tomcat Host Manage..

Router Props [내부링크]

list 화면에서 컴포넌트를 사용해 detail 화면으로 이동하는데 url에 파라미터를 추가하는 방식으로 진행했었음. to={//기존방식 "/list/detail/" + list.id + "?page=" +//파라미터들(검색 조건) currentPage + "&startDay=" + encodeURI(startDay) + "&endDay=" + encodeURI(endDay) } BUT 시각적으로 파라미터를 주렁주렁 달고 있으니 복잡해보이고 URL도 길어지는 등 별로라고 생각됨. 갓글에 검색해 보니 Router Props란 좋은 기능이 있었음. 참조 https://velog.io/@sham/Router-Props-link%EB%A1%9C-%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94..

The current branch master has no upstream branch. [내부링크]

집에서 테스트 프로젝트를 세팅하는 도중 git push를 했는데 이와 같은 git 에러가 뜸. fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master 갓글에 검색해보니 브랜치가 설정이 안 되어 있어서 git push --set-upstream origin master 명령어를 치면 간단히 해결된다고 함. 다시 보니 에러에도 위와 같은 명령어를 사용하라고 되어있음 머쓱.. 명령어를 치고 다시 git push 하니 잘 됨! 해결!

컴파일, 빌드 대체 무엇?(feat. 링크, 배포) [내부링크]

메이븐 프로젝트를 진행하면서 매일 같이 빌드를 진행하는데 문득 든 생각이 빌드가 뭐냐고 물어보면 대답을 어떻게 하지?? 그래서 갓글에 검색 후 내용 정리함 컴파일 (Compile) 이란? - 사용자(개발자)가 작성한 소스 코드를 바이너리 코드(이진 코드)로 알아들을 수 있는 컴퓨터를 위해 기계어로 번역하는 작업 - java의 경우 자바가상머신(jvm)이 실행 가능하도록 .java 파일이 .class로 변환됨 - 이러한 작업을 해주는 프로그램을 컴파일러라고 함 - 쉽게 말해 컴퓨터가 알아먹을 수 있도록 번역해 주는 것 링크 (Link) 란? - 여러 개로 분리된 소스파일들을 컴파일한 결과물들에서 최종 실행가능한 파일을 만들기 위해 필요한 부분을 찾아서 연결해 주는 작업 - 정적링크 : 컴파일된 소스..

Enum과의 첫만남 [내부링크]

다른 분의 프로젝트를 서포트 중 접속로그 상태를 저장하는데 enum을 쓰면 좋다고 함. enum? 이게 뭐지? 타입인가..? 궁금해서 갓글 검색. ※ Enum 정의 Enum : 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미함. 기존 상수를 정의하는 방법인 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용하면 같은 효과를 낼 수 있다고 함. 읽어보니 final static string과 같이 상수를 선언하면 잘못된 값이 들어가도 컴파일 시 모르는데 enum을 사용하면 컴파일 시 에러가 떠서 알 수 있다고 함. 그외 코드가 단순해지고, 가독성이 좋다고 함. 등등 ... 나의 상황에 접목시켜 봄. accessLogService.insertLog..

초보자를 위한 쿠키와 세션 이해하기 [내부링크]

웹 개발을 하다보면 쿠키와 세션을 자주 마주치게 되는데 매번 마주칠때마다 트루리셋이 되는 것 같아 이번엔 정리하면서 이해 & 머리에 주입시켜볼려고 함. 쿠키(Cookie)와 세션(Session)은 모두 웹 어플리케이션에서 사용되는 데이터 저장 방식임. 1. 쿠키(Cookie)란? - 사용자의 로그인 정보나 기타 정보를 브라우저에 저장하는 작은 데이터 파일 - 브라우저의 쿠키 스토리지에 저장되는 key-value 쌍으로, 서버로 전송되어 처리됨. - 사용자의 개인 정보를 저장하기 때문에, 보완적인 측면에서 주의해야함(민감한 정보 저장은 피하고 쿠키를 암호화해서 처리하는게 좋음) - 쿠키는 만료일이 지나면 자동으로 삭제가 되고, 만료일을 설정하지 않으면 브라우저가 종료될 때까지 쿠키가 유지됨. - 웹 개발에..

예약 관련 프로세스 오류 처리 [내부링크]

시설을 대관해주는 사이트를 개발하여 유지보수를 맡고 있었는데 시설이 사용 중이 아닌데 예약이 되었다는 담당자의 연락을 받음. 사용자 화면에서 예약 1, 예약 2 화면이 있는데 시설이 사용 중이지 않으면 예약 1 화면에서 예약 2 화면으로 넘어가지 못하도록 처리를 했었음(개발 당시). 사용자가 뚫은 건지 오류 때문인지 확실히 알 수 없으나, 재발하면 안되는 상황이기에 처리가 필요했음. 먼저 react를 사용한 뷰단에 처리를 시작할려는데, react는 데이터를 주고받는 게 rest ful API형태라서 jsp 같이 화면에서 화면으로 넘어갈 때 처리를 할 수가 없었음. 고심 끝에 이와 같이 처리하기로 함. 1. 예약 1 화면 > 예약 2 화면으로 넘어갈 때 클릭 이벤트 맨 위에 시설의 사용 유무를 판단하여 처..

[Spring Data JPA]복합키 설정(PK가 2개 이상일 때) [내부링크]

1. TMI(글 작성 계기) 새로운 프로젝트를 개발 중에 로그인 기능을 추가하던 중 유저 테이블과 관련된 유저 권한 테이블에서 PK가 2개인 것을 발견..? JPA를 사용하고 있었지만 PK가 두 개인 건 설정해 본 적이 없는 필자는 그냥 냅다 @id를 각 컬럼에 붙였음. 역시 에러가 뜸... 찾아보니 ID 값이 두 개라서 매핑 오류가 떴다는 것(당연하지만) 그래서 방법을 찾던 중 알게 된 방법 2가지!!! 1. @Embeddable 및 @EmbeddedId 설정(객체지향에 더 가까운 방법) 2. @IdClass 설정(RDB에 가까운 방법) 인데 결국 PK 클래스를 만들어서 Serializable 을 implements 하고 각각 설정을 해주는 방식임. 그럼 설정하는 방식을 알아보겠음c 참고로 필자는 1번..

[Spring Boot] 디렉토리 구조 변경 후 @Configuration 클래스 스캔 이슈 [내부링크]

1. 이슈 발생 상황 spring security를 사용하여 로그인 기능을 구현하려고 security config 클래스 파일을 생성하여 기본 로그인 기능까지는 만들었음. 그런데 프로젝트 디렉토리 구조를 변경해야 할 듯하여 전체적으로 수정을 진행함. 이해를 돕기위해 이런 식으로 구조가 되어 있었다고 가정하겠음. 그리고 이런식으로 구조를 변경했는데(실제 프로젝트는 아님)... security로 만들었던 로그인 기능이 작동을 안 함(로그인이 안 되는 상황 발생) 뭔가 디렉토리 구조를 변경해서 문제가 생긴 지는 알겠는데 에러도 안 뜨고 상황도 애매하니 갓글에 검색하기에도 어려웠음.c 2. 이슈가 발생한 과정 및 이유 돌고 돌다 @Configuration이 작동을 안 하는 듯하여 찾아보니 @ComponentSc..

[토스페이먼츠] 개발환경에서 가상계좌 테스트하기 [내부링크]

필자는 로컬 환경에서 가상계좌 테스트하는 방법을 몰랐는데 https://docs.tosspayments.com/common/webhook 웹훅(Webhook) 연동하기 | 토스페이먼츠 개발자센터 웹훅은 데이터가 변경되었을 때 상점 서버에서 실시간으로 알림을 받을 수 있는 기능입니다. 웹훅을 연동해서 결제 상태 변경, 지급대행 실행, 브랜드페이 고객 결제수단 업데이트와 같은 변경 docs.tosspayments.com 토스페이먼츠 쪽에 찾아보니 친절하게 알려주고 있었음. 매번 테스트 가상계좌를 발급받고 토스페이먼츠 개발자센터 > 테스트 결제내역에서 입금처리 or 취소 버튼 클릭했을 때 로컬환경이다 보니 웹훅을 받지 못해서 결제 테스트에 제한적이었음. 하지만 로컬이라도 웹훅을 받을 수 있다는 방법이 있어서..

[Spring Boot]JSP 수정한 코드가 바로 적용 안될 때 [내부링크]

Spring Boot 프로젝트를 생성해 front 단을 jsp로 구성하려고 설정한 뒤 jsp 파일을 만들고 간단한 태그를 추가했는데 F5를 눌러도 변경되지 않는 것!! 보통 jsp는 서버를 끄고 재구동 시키지 않아도 바로 적용이 되었는데 필자는 왜 그런지 몰라 바~로 갓글에 검색 해결책 이유는 잘 모르겠으나 필자가 추측하기론 spring boot는 jsp 사용을 권장하지 않아서 뭔가 지원이 안되서 그런 것이 아닐까.. 하는 뇌지컬 추측을 해봄. 다시 돌아와 해결책은 pom.xml 에 org.springframework.boot spring-boot-devtools 라이브러리를 추가한 뒤, application.yml 파일에서 spring: devtools: livereload: enabled: true..

[Maven]Blocked mirror for repositories: [...] [내부링크]

기존 프로젝트를 git에서 clone 받아와서 maven으로 빌드를 진행했는데 에러 내용 Failed to execute goal on project uis2021: Could not resolve dependencies for project com.insight.web:uis2021:war:1.0.0: Failed to collect dependencies at net.sf.ehcache:ehcache-terracotta:jar:2.1.1: Failed to read artifact descriptor for net.sf.ehcache:ehcache-terracotta:jar:2.1.1: Could not transfer artifact org.terracotta.forge:forge-parent:po..

[Maven]Fatal error compiling: invalid flag: --release [내부링크]

오랜만에 Spring Boot 프로젝트를 만드려고 spring initializr 사이트에서 3.x 대 버전의 Spring Boot 프로젝트를 선택하고 java 8 version으로 생성했음. 그런데 프로젝트를 intelliJ에서 import 하고 mvn package 명령어를 입력했는데 에러 내용 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project test: Fatal error compiling: invalid flag: --release -> [Help 1] 이와 같은 에러가 뜨면서 빌드가 실패함. 다른 메이븐 명령어도 동일.c️ 아무것도 추가한..

[Maven]There are test failures(feat. Failed to determine a suitable driver class) 에러 해결 방법 [내부링크]

기존 진행하는 React 프로젝트에 back단으로 Spring Boot를 추가하려고 https://start.spring.io 사이트에서 아래와 같은 설정으로 프로젝트를 생성함. 생성된 프로젝트 zip파일을 풀고 기분 좋게 intelliJ에서 import를 시킴. 그리고 메이븐으로 mvn install 명령어를 실행시켰는데..? 에러코드 Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project uis: There are test failures. Please refer to D:\dev\uis\target\surefire-reports for the individual..

AI 챗봇 사용법(feat. Chat GPT, Bard, HyperCLOVA X) [내부링크]

금일 네이버에서 하이퍼 클로바라는 초거대 AI를 출시해서 핫하길래 필자도 대세를 따라서 맛도 볼겸 겸사겸사 다른 AI 챗봇 사용법을 정리해봄. 1. Chat GPT(챗 GPT) 요건 굳이 말안해도 다들 알고 있을 너~~~무 유명한 녀석이라 설명은 생략하겠음. 거의 모든 AI 챗봇 사이트가 그렇듯이 사용방법은 매우 간단함. https://chat.openai.com/ ChatGPT A conversational AI system that listens, learns, and challenges chat.openai.com 사이트에 접속 후 Log In 버튼 클릭! 필자는 구글 연동하였는데 아무거나 연동하여 로그인하시면 됨! 짜잔~ 이제 궁금한 점을 Chat GPT 에게 물어보면 끝c 필자는 무료버전(GP..

[Java/Spring]numbers of source raster bands and source color space components do not match [내부링크]

홈페이지 유지보수 중 위와 같은 에러가 발생했다고 해서 찾아보니... 파일업로드할 때 이미지가 문제가 있으면 뜨는 에러라고 함. 이미지 문제?? 일단 개발 환경에서 테스트 진행해봄. 알고보니 썸네일을 생성하는 코드 쪽에서 이미지를 읽어오는데 위와 같은 에러가 발생함. 근데 이미지를 확인해도 문제가 없어보임. 갓글의 힘을 빌려 검색을 해보니 이미지에는 확장자 말고 타입이란게 있는데, RGB 또는 CMYK 등이 있다고 함. 근데 내가 읽으려고 하는 파일이 CMYK 타입의 이미지 였던 것! 그래서 BufferedImage srcImg = ImageIO.read('읽으려는 파일 경로'); 위 코드 부분에서 CMYK 타입의 이미지를 읽으려다 에러가 발생한 것! 해결 방법은 하단 참고 사이트에서 발견함. POM.x..

[docker]CentOs7에 JDK설치하기(1)(feat. 폐쇄망) [내부링크]

이번에 폐쇄망으로 된 Web 서버 및 Was 서버를 세팅할 일이 있어서 그전에 도커로 미리 연습 및 정리할 겸 이 글을 작성하게 됨. 이 글의 방향 설명 필자는 CentOs7 버전의 docker Image를 가져와 컨테이너 2개를 띄워 하나는 Web 서버, 하나는 Was 서버로 세팅할 생각임. 그리고 Was 서버는 톰켓을 3개 띄우고, Web 서버는 nginx를 설치하여 Web 서버로 접속해 Was 서버의 톰켓 화면(index.jsp)를 띄우는 게 최종 목표임. 폐쇄망이라 가정해 왠만해서 다운로드는 사용하지 않을 예정. 그럼 시작해보겠음! 시작하기 전 말씀드리지만 도커로 환경세팅을 하기 때문에 도커 데스크톱이 미리 설치되어있어야 함! docker desktop 설치경로 : https://www.dock..

[docker]CentOs7에 Tomcat9 설치하기(2)(feat. 폐쇄망) [내부링크]

2023.06.27 - [개발자 모드/개념] - [docker] CentOs7에 JDK설치하기(1)(feat. 폐쇄망) [docker]Web 서버와 Was 서버 만들기(1)(feat. 폐쇄망) 이번에 폐쇄망으로 된 Web 서버 및 Was 서버를 세팅할 일이 있어서 그전에 도커로 미리 연습 및 정리할 겸 이 글을 작성하게 됨. 이 글의 방향 설명 필자는 CentOs7 버전의 docker Image를 가져와 컨테 precious-value.tistory.com Tomcat9 설치 경로 : https://tomcat.apache.org/download-90.cgi Apache Tomcat - Apache Tomcat 9 Software Downloads Welcome to the Apache Tomcat..

[Tomcat] 톰켓 구동 시 profile 설정하기 [내부링크]

개발 초기 단계에서는 profile 설정을 따로 안 하겠지만 개발 환경과 배포 환경이 달라 profile 설정을 해야 할 때!! IntellJ에서는 Spring이라면 메이븐 톰켓 or Spring Boot라면 내장톰켓이 있기에 톰켓에 구동 시 profile을 명시하는 명령어를 입력해주어야 하고 배포 환경(툴을 쓰지 않는 환경)에서는 Tomcat 쪽에 설정을 해주어야 함. 먼저, IntellJ를 사용할 때 설정 방법 알려드리겠음! 1. IntellJ에서 설정 설정방법은 IntellJ를 실행한 다음, 우측 상단에 보시면 이미지와 같은 탭이 있음! 클릭 이후 Edit configurations... 를 클릭 이런 창이 뜨는데 이 창에서 Modify options > Add VM options를 클릭(단축..

[CentOs] shell(.sh) 파일 만들기 [내부링크]

서론(바쁘시면 본론부터) 도커 컨테이너를 띄워 WAS 서버를 세팅하고자 함! centos7 버전의 컨테이너를 띄우고 Tomcat 3개를 만들어서 포트 설정까지 완료했음. 그런데 톰켓 서버를 구동시키고 끄고하는데 하나하나 명령어를 쳐서 진행하니 너무 귀찮고 시간도 더 걸렸음.c 그래서 톰켓서버 3개 한번에 꺼지거나 구동시킬 수 있는 shell 파일을 만들고자 함. 필자는 /was 디렉토리 안에 위와같이 구성했음. 간단한 설명 - tomcat9-~ : 각각의 톰켓서버 파일 - startup_all.sh : 톰켓 서버를 한번에 구동시키는 sh 파일 - shutdown_all.sh : 톰켓 서버를 한번에 종료시키는 sh 파일 startup_all.sh 파일 추가/수정(vi startup_all.sh 명령어 ..

[Bat]간단한 배치 파일 만들기 [내부링크]

회사에서 선임이 알려준 대로 docker compose를 사용하는데 배치파일을 작성해 배치파일을 실행함으로써 한 번에 도커 컨테이너를 삭제하고 다시 만드는 Awesome한 광경을 본 뒤 필자는 배치 파일을 궁금해하지 않을 수 없었음. 그래서 갓글에 바로 검색 배치파일이란?? - Windows 운영 체제에서 사용되는 스크립트 파일로 일련의 명령어를 포함하며, 일련의 작업을 자동화하거나 여러 명령어를 한꺼번에 실행하는 데 사용됨 - 일반적으로 ".bat" or ".cmd" 확장자를 가지며, 텍스트 파일 형식으로 작성됨 - 배치 파일은 보통 자주 반복되는 작업을 자동화하는 데 사용하며, 특정 작업을 주기적으로 실행해야 하는 경우 배치파일을 작성해 작업을 예약할 수 있고, 여러 명령어를 한 배치 파일에 작성..

[Spring Boot / React 프로젝트] classPath 설정 방법 [내부링크]

이번에 Spring Boot + React + Gradle 프로젝트를 진행하게 되었음. 설명이 잘 되어 있는 블로그를 참고해서 초기 세팅을 하는데 React 정적 파일들 설정을 어떻게 해야하는지 몰라서 찾아보며 정리함. ※ Spring Boot + React 프로젝트 정적 파일 관련 설정 방법 React와 Spring Boot를 함께 사용하는 경우, React에서 빌드된 정적 파일들을 Spring Boot 애플리케이션과 함께 배포할 때, 일반적으로 Spring Boot의 정적 파일(Static files) 디렉토리에 위치시키는 것이 일반적입니다. 보통 React 프로젝트는 빌드를 진행하면, build 디렉토리에 빌드된 정적 파일들이 생성됩니다. 이후 Spring Boot 프로젝트의 정적 파일 디렉토리(s..

[Git] Spring Boot + React 프로젝트 git에 add 안될 때 [내부링크]

Spring Boot + React 프로젝트를 진행하는데 초기 세팅을 끝내서 GitLab(필자의 원격저장소)에 push 진행. ※문제 상황 1. react 파일 경로인 /app 경로의 파일만 git에 add가 안됨. 혹시 몰라서 .gitignore 파일에 찾아봐도 해당사항 없음. 애초에 .gitignore 파일에 있으면 아예 제외되야 하는데 git status를 치면 /app 경로를 관리는 하고 있음. 2. submodule을 추가하라는 git 관련 hint 메세지가 나옴. 3. 원격 저장소에 가면 폴더는 올라갔는데 파일 접근이 안됨. 이유를 몰라서 갓글에 검색해 보니 하위 폴더인 app 경로 안에 .git 파일이 있어서 문제가 됐던 것! 해결방법 1. 하위 폴더안에 .git 폴더 삭제처리 - 필자의 ..

git에 package.json, package-lock.json 파일을 관리해야할까? [내부링크]

react로 만든 팀 프로젝트를 진행하면서 문득 든 의문점 package.json, package-lock.json 파일을 깃랩에 올려서 관리해야할까?? 그래서 어렴풋이 알고있는 저 파일들이 무슨일을 하는지 알아봄. ※ package.json 이란? - npm(or yarn) init 을 하면 생성되는 파일로써, npm 패키지들에 대한 정보(name, version 등)들이 적혀있는 json 형태의 파일임. - 필수적으로 name이나 version에 대한 정보가 명시되어야하며 이 정보가 없으면 패키지를 설치할 수 없음. - npm install을 사용하여 package.json 에 명시된 의존성 패키지들을 node_modules 폴더에 설치해줌. ※ package-lock.json 이란? - 생성된 no..

프록시 서버(Proxy Server) 대체 무엇? [내부링크]

필자의 경우 서버 환경을 구성할 때 보통 Web Server를 거쳐서 외부 서버와 데이터를 주고받지만 외부 서버와 직접 통신을 해야할 경우가 생김. 하지만 방화벽이 막혀있어서 통신이 안됨. 물론 이런 경우 개인이면 방화벽을 열어서 처리 할 수 있지만 대부분 개인이 아니기에 보안상 함부로 설정을 변경할 수 없음. 그래서 Proxy 서버를 Web Server 처럼 중간에 두고 외부 서버와 통신하는 방법을 사용함. 그럼 이제 Proxy 서버가 무엇인지에 대해서 알아보자! ※ Proxy 서버란 - Proxy란 사전적 의미로 "대리"이며, 빠른 액세스나 안전한 통신등을 확보하기 위한 중계서버를 일컫음. - 보통의 경우 클라이언트와 Web서버의 중간에 위치하거나 필자의 경우처럼 서버와 서버 사이에 위치하여, 대신 ..

Spring에서 ajax return 404 Error 날 때 [내부링크]

필자는 뷰단은 jsp를 사용하고 서버는 Spring을 사용하는데, jsp에서 뷰말고 데이터만 가져와야할 상황이 생겨서 ajax 통신을 사용하여 컨트롤러로 보냈음. 근데 요청은 잘가는데 return할 때 404 Error가 뜸.. 이유를 몰라 갓글에 검색해서 찾아보니 결과적으로는 컨트롤러 return 타입에 @ResponseBody 를 추가해주지 않아서 뜨는 에러라고 함 @RequestMapping(value = "/url") public @ResponseBody Map getDeptList(SearchVO searchVO){ //이 부분 Map resultMap = new LinkedHashMap(); resultMap.put("deptList",imtDeptDtService.findAllDeptList..

Spring Security 멀티 로그인 구현하기 [내부링크]

2022.11.03 - [개발자 모드/Spring Security] - Spring Security 사용하여 로그인 구현하기 Spring Security 사용하여 로그인 구현하기 다들 아시다시피 Spring Security 5.7.x 버전 이후부터 WebSecurityConfigurerAdapter가 deprecate(사용되지 않게) 될 예정이기 때문에 Spring Security에서 지향하는 SecurityFilterChain을 @Bean으로 등록하는 방식으로 진 precious-value.tistory.com 에 이어서 이번엔 관리자, 사용자 각각의 화면과 로그인 기능을 구현해보려고 함. 필자도 공부하면서 진행하는 거라서 틀린 점 있을 수 있음!! 알려주시면 감사하겠음!!! 1. 개발 스펙 - Spr..

Spring Security 사용하여 로그인 구현하기 [내부링크]

다들 아시다시피 Spring Security 5.7.x 버전 이후부터 WebSecurityConfigurerAdapter가 deprecate(사용되지 않게) 될 예정이기 때문에 Spring Security에서 지향하는 SecurityFilterChain을 @Bean으로 등록하는 방식으로 진행해보겠음. Spring Security without the WebSecurityConfigurerAdapter에서 자세한 설명 확인 가능함. 필자는 먼저 단일 로그인 방식, 즉 하나의 security config로 로그인을 구현한 뒤, 멀티 로그인 방식으로 진행할 예정(다음 포스팅에서)임. 멀티 로그인 방식은 쉽게 말해 사용자, 관리자의 로그인 화면이 개별로 있고 spring security 설정도 사용자, 관리자 ..

Spring Session 시간 설정 방법 [내부링크]

유지보수 중 테스트를 위해서 session을 날려야 하는 순간에 맞닥뜨렸음. 갓글에 검색해보니 쉽게 해결되었음. 필자는 Spring Security 로그인 성공 시 이동하도록 설정한 SuccessHandler에 시간 설정을 했음. //authentication-success-handler 코드 HttpSession session = request.getSession();//세션을 가져옴 session.setMaxInactiveInterval(60);//파라미터에 넣는 값이 설정 시간임(초단위) 위와 같이 설정하면 60초 뒤에 세션이 날아감. 간단 그자체! 참조 https://javaoop.tistory.com/104 [Spring] Session 우선순위 및 시간 설정 변경하기 Session 우선순위 ..

Could not determine type for: , at table: , for columns: [org.hibernate.mapping.Column()] [내부링크]

개인프로젝트 도메인 관련 설정 중 위와 같은 에러 메세지를 만났음. ※에러메세지 Could not determine type for: ex.. , at table: ex.., for columns: [org.hibernate.mapping.Column(ex..)] (ex.. 은 개인마다 달라서 예시로 적었음) 갓글에 검색해보니 두 Entity 간의 관계가 기술되지 않아서 발생한 문제라고 함. 즉, 도메인 필드는 만들었지만 어노테이션을 설정하지 않았거나, 옳바르지 않은 매핑 관계를 설정했을 때 등 에러가 발생함. 필자의 코드를 살펴보니 //article 도메인의 필드 @Comment(value = "게시판아이디") @JoinColumn(name = "board_id") //@ManyToOne을 추가해야함!..

Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: [내부링크]

게시판과 게시글 도메인을 만들던 중 에러를 만났음. ※에러 메세지 - Illegal attempt to map a non collection as a @OneToMany,@ManyToMany or @CollectionOfElements: 도메인 경로 파파고 번역기를 돌려보니 비 컬렉션을 @OneToMany, @ManyToMany 또는 @CollectionOfElements로 매핑하려는 잘못된 시도: 라는 뜻이였음. 거두절미하고 갓글 검색하여 얻은 해결방법 !! 일대다인 @OneToMany를 설정한 Article을 List로 변경해야 한다는 것. ※해결방법 //이전 코드 @OneToMany private Article article; //변경된 코드 @OneToMany private List article..

Spring MVC @ControllerAdvice 활용하기 [내부링크]

다른 프로젝트에서 @ControllerAdvice라는 어노테이션을 발견함. 갓글에 검색해보니 보편적으로 패키지로 범위를 지정하여 전역 컨트롤러를 만듦으로써, 예외 처리를 적용시킬 때 사용하는 것 같음. 필자는 예외 처리 말고 또 다른 사용법 중 하나인 @ModelAttribute를 이용하여 다른 컨트롤러에서 뿌려주는 화면 단에서 모델 정보를 사용할 예정임. 먼저 ControllderAdvice 클래스를 만들어야 함. //JPA, Spring Boot 사용 @ControllerAdvice(basePackages = {"com.exam.controller.user"})//패키지 설정 public class UserControllerAdvice { @Autowired private BoardRepository..

React Simple Captcha(자동입력방지) 추가하기(2) [내부링크]

저번 글에 이어서 사용자가 입력한 문자 체크하는 방법 및 새로고침 기능 구현을 계속해서 진행해 봄. 혹시 캡차 이미지 구현을 아직 안하신 분을 위해(https://precious-value.tistory.com/14) 먼저 1. 새로고침 기능 구현을 진행해 봄. //새로고침 버튼 getImage(e)//새로고침 버튼을 클릭했을 때 로직 } > 새로고침 저번시간에 만들었던 새로고침 버튼을 클릭했을 때 getImage 함수를 실행. //새로고침 버튼을 클릭했을 때 const getImage = e => { e.preventDefault(); var rand = Math.random(); var url =//캡차 이미지 생성 url Config.url + Config.contextPath + "/api/ren..

React Simple Captcha(자동입력방지) 추가하기(1) [내부링크]

담당자에게서 몇몇 사용자들이 예약 관련 매크로를 사용해 예약을 한다는 항의 전화가 자꾸 와서 자동 입력 방지 라이브러리를 추가하여 매크로를 방지해보려고 함. 여기서 잠깐 Captcha란? ※Captcha란? Completely Automated Public Turing test to tell Computers and Humans Apart의 약자로, 컴퓨터와 사람을 구분 짓기 위한 완전 자동 튜링 테스트라고 함. 찾아보니 Captcha 종류가 여러 개였는데 아마 우리가 가장 잘 알고 있는 게 구글의 reCAPTCHA가 아닐까 싶음.(사실 필자는 이 친구 별로 안 좋아함. 인증 스트레스cc) 어르신들이 많이 쓰는 예약사이트라 reCAPTCHA를 넣으면 민원이 최소 10배는 늘 것 같아서 제외함. 담당자 쪽..

React 토스페이먼츠 카드 전표 출력하기 [내부링크]

토스 페이먼츠를 사용하여 결제 시스템을 구현한 웹 사이트를 유지보수하던 중. 카드 전표(영수증)을 뽑을 수 있냐는 담당자의 문의 전화가 왔음. 토스 페이먼츠 개발자 센터를 찾아보니 되는 것 같음. ※주의 이 글은 토스 페이먼츠 결제시스템이 구현된 상태에서 진행해야 함. 위 로직대로 사용자가 결제를 완료하여, 설정한 결제성공 리다이렉트 URL에서 결제 정보를 Payment 테이블에 저장을 함. //토스페이먼츠에서 받아오는 결제정보 "card": { "company": "농협", "number": "12345678****789*", "installmentPlanMonths": 0, "isInterestFree": false, "interestPayer": null, "approveNo": "00000000"..

Spring Security passwordEncoder 설정 관련 [내부링크]

스펙 : Spring Boot, h2 db, jsp h2 db에 아래 표와 같이 관리자 데이터를 insert 후 id password admin 123 Spring security를 사용해서 로그인 로직 구현 중 로그인을 했는데 There is no PasswordEncoder mapped for the id "null"와 같은 에러를 만났음. 바로 갓글에 검색. 여러 블로그를 찾아보고 종합한 결과 필자는 security 설정에 password encoding 설정을 하지 않았고, 비밀번호가 텍스트 형태라서 에러가 났음. 해결방법 1. db에 저장된 pw앞에 prefix를 붙여서 저장하는 것 혹은 password를 비교할 때 prefix를 붙여주는 것. //db insert문 insert into ex..

React 회원가입 시 유효성 검사하기 [내부링크]

회원가입 중 아이디 유효성 검사를 하는데, 영문자 + 숫자 , 6자리 이상으로 정규식으로 체크를 하여 진행했음. //기존코드 let idCheck = /^(?=.*?[A-Za-z])(?=.*?[0-9]).{6,}$/; //영문자 + 숫자 , 6자이상 //주의 ! 특수문자 포함가능임. 하지만 특수문자가 아이디에 포함되면 안 돼서 기존 정규식을 수정하거나, 특수문자를 제외하는 정규식을 만들어 한번 더 체크해야 했음. 기존 정규식을 수정하는 게 코드도 안 길어지고 좋아서 바로 갓글 검색. 영문자와 숫자만 입력할 수 있는 정규식으로 수정. //수정코드 let idCheck = /^[A-Za-z0-9]{6,}$/;//영문자 + 숫자만 , 6자 이상 if (idCheck.test(e.target.value)) { ..

React 게시판 목록 날짜 별로 정렬하기 [내부링크]

어느 날 어김없이 유지보수 요청이 들어왔음. 예약목록이 있는데 날짜별로 정렬할 수 있도록 만들어달라 함. 먼저 대관일시를 클릭했을 때 오름차순인지 내림차순인지 알 수 있도록 표시(, )를 추가 후 링크처리 함. //대관일시 컬럼 sortRentDate(e)}>//클릭 시 로직 추가 대관일시 {sortStatus === "up" ? "" : sortStatus === "down" ? "" : ""} 처리 후 정렬 상태를 관리할 변수를 추가해줌. const [sortStatus, setSortStatus] = useState(null); //대관일시 정렬 상태 클릭했을 때 실행되는 함수임. //대관일시 클릭했을 때 const sortRentDate = e => { //대관일시별 정렬기능 e.preve..

React 팝업창 띄우기(2) - 하루 동안 보지 않기 [내부링크]

앞서 팝업창 띄우기까지 했지만 기능 추가 요청이 들어옴. 바로바로 하루 동안 보지 않기 기능! 개발엔 안 되는 게 없다는 마인드를 가진(x) 가지려고 노력하는 나. 바로 기능 개발 시작. 예전에 만들어봤었던 방식으로 진행하겠음. 코드는 2022.10.06 - [개발자 모드/React] - React 팝업창 띄우기(1) React 팝업창 띄우기(1) 관리자 화면에서 등록한 팝업창을 사용자 화면에서 띄우기 위해 팝업 컴포넌트를 만들어서 작업하던 중 다른 방법이 없을까? 해서 갓글에 검색. 찾아보니 React-Modal이란 라이브러리 발견. 여기서 precious-value.tistory.com 전에 만들어놓은 팝업창 그대로 사용하겠음. 먼저 위 사진처럼 하루 동안 보지 않기 버튼을 추가해줌. //하루동안 보..

React 팝업창 띄우기(1) [내부링크]

관리자 화면에서 등록한 팝업창을 사용자 화면에서 띄우기 위해 팝업 컴포넌트를 만들어서 작업하던 중 다른 방법이 없을까? 해서 갓글에 검색. 찾아보니 React-Modal이란 라이브러리 발견. 여기서 잠깐. ※ Modal 이란? - 특정 이벤트에서 확인하거나 특정 이벤트를 날려주지 않으면 원래 하던 작업을 계속 이어갈 수 없는 새창. - 특정 이벤트에서 새창을 띄웠을 때 원래 하던 작업을 계속 이어갈 수 있게 해놓은 것이 모달리스라는 반대 개념도 있음. 이거다 싶어서 Modal을 사용해서 팝업창을 만드는데 불편하거나 안맞는 점들이 있음. 1. 필자는 원래 쓰던 디자인을 Modal에 맞게 변경해야 함. 2. 팝업이 뜨더라도 원래 하던 작업을 계속 할 수 있도록 하고 싶음. 3. 검증이 필요. 4. 보통 re..

Git Branch Naming & Strategy [내부링크]

평소대로 기능 개발을 위해 gitlab에서 브랜치를 만들려던 찰나! 브랜치도 명명 규칙이 있을 것 같아서 갓글에 검색. 알고 보니 네이밍 규칙뿐만 아니라 브랜치 전략이란 게 있었음. 오전 시간을 갈아 넣어 속성으로 공부한 바탕으로 정리해봄.(자세한 설명은 참조사이트 참고. / 엄청 잘 정리되어있음.) ※ Git 브랜치 전략 - 브랜치 전략이란 여러 개발자가 하나의 저장소를 사용하는 환경에서 저장소를 효과적으로 활용하기 위한 work-flow. - 브랜치의 생성, 삭제, 병합 등 git의 유연한 구조를 활용해서, 각 개발자들의 혼란을 최대한 줄이며 다양한 방식으로 소스를 관리하는 역할을 함. > 즉, 브랜치 생성에 규칙을 만들어서 협업을 유연하게 하는 방법론 - 가장 널리 사용되는 2가지 브랜치 전략이 있..

React 동적으로 style 추가 [내부링크]

비가 주륵주륵 오는 걸 감상하며 평화롭게 프로젝트 프론트단을 만들던 중 리액트에서 스크립트 기능이 필요해짐. 예를 들어 상단 메뉴에 마우스를 올렸을 때 숨겨진 서브 메뉴를 보여주는 기능, 이런 탭 클릭했을 때 임팩트주는 기능 등등... 동적으로 style 입혀주는데 스크립트로 원래 하던것처럼 document.getElementById(id).style.color = 'red'; 이런 식으로 ID 값을 추적하는 방식으로 할려고 했으나 생각해보니 리액트는 다른 방법이 있을 것 같아서 갓글에 검색. 검색해보니 useState라는 리액트 훅으로 상태를 사용해 동적으로 style을 변경할 수 있다고 함. 위의 공지사항, Q&A 탭을 선택했을 때 style을 변경하는 기능을 만들어 봄. import React, {..