본문 바로가기

분류 전체보기

[Nginx] 웹사이트 크롤링 방지 여러 서비스를 운영하다 보면 정말 많은 크롤러들이 인터넷 망을 샅샅이 뒤지고 다닌다는 것을 체감하게 된다. 예를 들어 사내에서 운영중인 관리 시스템이 구글에서 검색이 될 때 깜짝 놀라게 되는데, 왜 미리 막지 않았을까 후회하면서 글을 적는다. 따로 robots.txt 파일을 루트 디렉토리에 보관할 수도 있지만 우리회사는 보통 nginx를 reverse proxy로 사용하기때문에 설정 파일에 직접 입력한다. nginx.conf server { listen 80; server_name hello.userinsight.co.kr; location /robots.txt { return 200 "User-agent: *\nDisallow: /"; } location / { proxy_pass http://loca..
[업무공유] 소프트웨어사업자 신고 절차 및 방법 조달청에 입찰참가를 하려는 경우 여러가지 증빙서류가 필요합니다. 그 중에 '소프트웨어사업자 신고'에 대해 알아보겠습니다. 소프트웨어사업자 신고란? 소프트웨어의 이용촉진 등 소프트웨어산업의 진흥을 위하여 필요한 경우 소프트웨어사업자로 하여금 기술인력, 사업수행 실적 등 관리에 필요한 사항을 분야별로 신고하도록 되어있는데, 소프트웨어 수요자에게 신뢰성 있는 정보제공을 통한 소프트웨어 이용촉진 등 산업의 건전한 발전을 도모하고, 중소소프트웨어사업자의 권익 보호를 목적으로 하고있습니다. ⊙ 소프트웨어사업자신고 분야 - 컴퓨터관련 서비스사업 - 데이터베이스 제작 및 검색서비스 사업 - 패키지소프트웨어 개발, 공급사업 - 디지털콘텐츠 개발서비스사업 ⊙ 관련 법령 - 소프트웨어진흥법 제58조(소프트웨어사업자의 실적 ..
[Jackson] 순환참조 해결방법 시간표 관리 시스템을 개발하면서 피할 수 없는 Json 순환참조(Circular Reference) 문제가 발생하였다. 즉 직렬화를 하면무한 루프에 빠지게 되는 것. 문제점 과목(Subject)와 강의실(Room)은 다대 다(ManyToMany)관계를 갖는데, 서로 참조 관계에 있기 때문에 StackOverflowError가 발생 일반적인 해결책 일반적으로 @JsonIgnore를 이용해 해당 필드의 직렬화를 막거나, @JsonManagedReference - @JsonBackReference 쌍을 이용해 단방향으로만 직렬화가 가능하게 한다. 또 문제 하지만 우리는 조금 더 특별한 해결책이 필요하다. 순환참조 없이 양방향 직렬화가 필요하기 때문 즉 Subject 하뒤에도 Room 이 필요, Room 하위에..
[아이디어] 데이터베이스 행 삭제 처리 시 UK(Unique Key) 제약조건으로 인한 값 중복 문제 회피하기 개발을 하다 보면 UK(Unique Key) 제약조건을 이용해야 하는 경우가 빈번하게 발생한다. 유저인사이트에서는 데이터를 물리적으로 삭제하는 행위를 delete라 하며, 데이터를 물리적으로 삭제하지 않고 삭제된 것 처럼 보존하는 행위를 remove라 정의하여 활용 중에 있다. 겪었던 문제 가장 대표적으로 로그인 기능에 사용되는 사용자 ID(이하 username이라 함)를 예로 들 수 있는데, 만약 사용자가 탈퇴할 때 remove처리를 해야 한다면 이 username을 어떻게 처리해야 할 지 난감한 경우가 생길 수 있다. (사용자 입장에서는 만약 다시 가입하기를 희망한다면 같은 아이디를 사용할 확률이 매우 높기 때문에..) 솔루션 아래는 강의실 정보를 관리하는 테이블에서 UK인 강의실명을 재사용 할 수 ..
[Redis] Spring Boot + Redis으로 세션 클러스터링(Session Clustering)하기 Spring Boot로 개발한 서비스를 로드밸런싱 하기 위해서는 별도의 세션 저장소가 필요하다. 가장 많이 쓰이는 Redis를 이용해 Spring Boot 애플리케이션의 세션 저장소로 사용하고, 여러 WAS가 동일한 세션 저장소를 사용하도록 하여 세션 클러스터링을 진행하기로 하였다. pom.xml org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis application.yml spring: redis: host: localhost port: 6379 session: store-type: redis UserinsightApplication.java @EnableR..
[JPA] 빈 문자열을 null로 저장하는 converter 만들기 JPA를 사용하여 웹 서비스를 개발하다보면 Form 전송을 해야 하는 경우가 많이 발생하는데 문자열을 담는 필드를 전송하다보면 의도치않게 null값이 아닌 empty-string이 삽입되는 경우가 발생한다. 따라서 빈 문자열이 데이터베이스에 저장될 때 null로 변환해주는 converter를 만들어 필드에 적용한다. EmptyStringToNullConverter.java @Converter public class EmptyStringToNullConverter implements AttributeConverter { @Override public String convertToDatabaseColumn(String string) { return StringUtils.trimToNull(string); }..
(0 , (_wordwrap || _load_wordwrap(…)).default)(…)(…).trimStart is not a function on expo init - 에러 개요처음 ReactNative의 공식문서를 따라서 예제 프로젝트를 실행시키다 보면 '(0 , (_wordwrap || _load_wordwrap(…)).default)(…)(…).trimStart is not a function on expo init 와 같은 에러가 발생하는 경우가 있다. 본 글에서는 위 에러의 발생원인과 처리방밥에 대해서 안내한다. 발생원인expo 공식 문서를 확인해보면 Node.js가 10 버전 이상의버전이 필요함을 알 수 있다. 해결방법 1. 캐시 삭제 1$ sudo npm cache clean -fcs 2. n 모듈 설치1$ sudo npm install -g ncs 3. n 모듈을 사용하여 Nodejs 설치 1$ sudo n stablecs ※ 현재 설치된 Node.js가 무슨..
Hibernate 부모-자식 연관관계 삭제 문제 개요조직-부서 관계를 가진 Entity를 개발 중에 발생한 문제였습니다.조직은 여러 개의 부서를 가질 수 있는 다대 다 관계의 모델을 구성했는데, 조직이 삭제되면 하위에 있는 모든 부서가 삭제되어야 하는 기능입니다. 1234@OneToMany(mappedBy = "organization", cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER)@OnDelete(action = OnDeleteAction.CASCADE)@JsonBackReferenceprivate List departments = new ArrayList();Colored by Color Scriptercs 위와 같이 구현을 완료하고 삭제 버튼을 클릭하는 순간 DataIntegrityViolat..