Spring
  • Swagger 요즘 백엔드 개발은 ModelAndView 방식보다는 API 위주의 어플리케이션을 권장하고 있다. API 개발이 많아짐에 따라, 프로젝트 안의 API를 관리할 수 있는 문서가 필요해졌다. API 문서를 만들기 위해서 Swagger을 프로젝트 안에 Setting 하여 사용해보자. Swagger에는 많은 기능들이 담겨져있다. 우리는 Swagger을 사용하여 어노테이션을 통해 그 많은 기능들을 사용할 수 있다. Swagger + SpringBoot 연동 1. build.gradle 에 의존성 추가 //swagger compile "io.springfox:springfox-swagger2:2.9.2" compile "io.springfox:springfox-swagger-ui:2.9.2" 2. W..

    Read more
  • Feign 적용 외부 API를 쉽게 호출할 수 있는 Http Client Binder인 Feign을 적용해보자. 개발환경 : SptringBoot 2.1.8 1. build.gradle 에 의존성 추가 //feign compile "org.springframework.cloud:spring-cloud-starter-openfeign:2.1.0.RELEASE" 2. application.yml 에 feign으로 연동할 외부 Server 정보 설정 # feign URL feign: test-api: url: http://localhost:7070 httpclient: connection-timeout: 1 3. SpringBoot의 xxxAplication.java 파일 안에 @EnableFeignClien..

    Read more
  • jenkins 설치 1) 명령어 입력 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key sudo yum install jenkins jenkins의 위 버전은 jdk 1.8 이상이여야 실행이 가능하다. ec2에는 기본적으로 jdk1.7이 설치되어있기 때문에 jdk update를 해야한다. jdk update (jdk1.7 delete -> openjdk11 install) 1) jdk1.7 delete sudo yum remove java-1.7.0-openjdk 2..

    Read more
  • to_char 아래는 ORA-01481: 숫자 형식 모델이 부적합합니다 에러가 발생 sche_date는 yyyymmdd 형식인데, 오라클에서 이를 Number 형식으로 인식한다. 숫자를 ‘YYYY-MM-DD’형식으로 변경하려고하니 에러가 발생한다. select to_char(sche_date, 'YYYY-MM-DD') from schedule; to_date 아래는 정상작동한다. 오라클에서 sche_date을 날짜로 인식한다. select to_date(sche_date, 'YYYY-MM-DD') from schedule; to_date - to_char to_date로 날짜로 변경해준 후에, to_char을 사용하면 된다. select to_char(to_date(sche_date, 'YYYY-MM-D..

    Read more
  • 에러발견 스프링부트 환경설정을 진행하다가 공통 에러처리를 하는데 발견한 에러였다. 404 eroor가 발생하면 내가 생성한 공통 에러처리 부분을 타야하는데 계속해서 스프링부트에서 제공하는 404 에러페이지가 나왔다. 해결방안 **.yml 파일 안에 아래 코드를 넣어주자. spring: # error 404 mvc: throw-exception-if-no-handler-found: true dispatch-options-request: false

    Read more
  • 스프링 DI (Dependency Injection)란? 자바에서 객체를 생성하기 위해서는 Test test = new Test(); 을 사용한다. new 연산자를 사용하여 인스턴스를 생성하는 행위이다. 이와 다르게, DI는 위 코드처럼 객체를 생성시키는게 아닌, 외부에서 객체를 생성해서 주입시켜주는 방식이다. DI는 필요한 객체를 해당 .java 파일 안에서 new 연산자를 통해 생성하는 것이 아닌, 외부에서 생성된 객체 중 필요한 객체를 연결하는 것이다. 필드 주입 결론적으로, 필드 주입을 사용하는 것은 추천하지 않는다. @Autowired private Mapper mapper; 위 코드를 IntelliJ IDE에서 사용하면 @Autowired 에 경고가 뜨게된다. Field injection is..

    Read more
  • 에러 발생 Poi 라이브러리를 사용하여 엑셀 다운로드 개발을 하는 도중, 다운로드된 파일을 열때마다 에러가 발생하였다. [파일명]에 읽을 수 없는 내용이 있습니다. 이 통합 문서의 내용을 복구하시겠습니까? 이 통합 문서의 원본을 신뢰할 수 있는 경우 [예]를 클릭하십시오. 이 상태로 [예]를 누르게 되면 파일이 열리면서 아래 메세지가 적힌 팝업이 뜹니다 [파일명.xlsx](으)로 복구 읽을 수 없는 내용을 복구하거나 제거하여 파일을 열 수 있습니다. [복구] 버튼을 누르면 엑셀파일은 알맞게 생성되었지만 열때마다 뜨는 경고창을 해결해야했다. 해결 Before response.setHeader("Set-Cookie", "fileDownload=true; path=/"); response.setHeader("..

    Read more
  • 스프링의 빈 오브젝트 스프링의 애플리케이션 컨텍스트는 IoC 컨테이너로써, 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다. 스프링은 여러 번에 걸쳐 빈을 요청하더라도 매번 동일한 오브젝트를 돌려준다. getBean() 메소드를 실행할 때마다 같은 오브젝트를 돌려준다. 스프링은 기본적으로 별다른 설정을 하지않으면, 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다. 왜 스프링은 싱글톤으로 빈을 만들까? 스프링이 주로 적용되는 대상은 자바 엔터프라이즈 서버환경이다. 자바 엔터프라이즈 서버환경이란, 서버 하나당 최대로 초당 수십에서 수백번씩 브라우저나 다른 시스템으로부터의 요청을 받아 처리할 수 있는 높은 성능이 요구되는 환경이다. 만약 매번 클라이언트에서 요청이 올때마다 각 로직을 담당하는 오브젝트를..

    Read more
  • 관심사의 분리 (Separation Of Concerns) 관심이 같은 것끼리는 하나의 객체 안으로 또는 친한 객체로 모이게 하고, 관심이 다른 것은 가능한 한 따로 떨어져서 서로 영향을 주지 않도록 분리하는 것이다. 어떠한 기준 없이 모으는 편이 처음엔 간단하고 쉽겠지만 언젠가는 여러 종류의 관심사(기준)를 적절하게 구분하고 따로 분리하는 작업을 해줘야한다. 관심사가 같은 것끼리 모으고 다른 것은 분리해줌으로써 같은 관심에 효과적으로 집중할 수 있게 만들어주는 것이다. 중복 코드의 메소드 추출 여러 메소드에 중복 코드가 구현되어있다고 가정해보자. 만약 메소드가 1~2개라면 어떠한 변경이 일어났을때 어려움이 없다. 하지만 만약 중복 코드를 가진 메소드가 몇 백개, 몇 천개라고 생각해보자. 중복 코드의 코..

    Read more
  • 개방 폐쇄 원칙 (OCP : Open-Closed Principle) 깔끔한 설계를 위해 적용 가능한 객체지향 설계 원칙 중의 하나로, ‘클래스나 모듈은 확장에는 열려있어야하고 변경에는 닫혀있어야한다.’라고 할 수 있다. 이 말은 즉 확장성은 높고 미래의 변화에 대한 준비를 철저히 하고있다는 얘기와 같다. 인터페이스에 의해 제공되는 확장 포인트는 확장을 위해 개방되어있고, 인터페이스를 이용하는 클래스는 자신의 변화가 불필요하게 일어나지 않도록 폐쇄되어있다. 인터페이스를 사용하여 확장 기능을 정의한 대부분의 API가 개방 폐쇄 원칙을 따르고있다. 인터페이스의 사용 위 개방 폐쇄 원칙에서 인터페이스의 확장성을 얘기했는데, 이를 더 깊이 이해하기 위해서 인터페이스에 대해 좀더 알아보자. 우선 추상화란, 어떤 ..

    Read more
  • org.apache.commons.fileupload.FileUploadException 에러발생 에러내용: Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found 스크립트 총 10개의 파일업로드할 input을 생성하였다. $.ajax({ url: '/v1/model/modelInsertSave', data: formData, type: "POST", contentType: false, processData: false,..var formDat..

    Read more
  • 일반적은 프로그램의 흐름 1) mian() 메소드와 같이 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정한다. 2) 결정한 오브젝트를 생성한다. 3) 만들어진 오브젝트에 있는 메소드를 호출한다. 4) 그 오브젝트 메소드 안에서 다음에 사용할 것을 결정하고 호출한다. 이 4가지 단계가 반복적으로 일어난다. 이런 프로그램 구조에서 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다. 모든 오브젝트가 능동적으로 자신이 사용할 클래스를 결정하고, 언제 어떻게 그 오브젝트를 만들지를 스스로 결정한다. 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조이다. 제어의 역전 제어의 역전이란, 위에서 설명한 일반적인 프로그램의 제어 흐름 구조가 뒤바뀌는 것이라고 설명할..

    Read more
  • 의존관계란? 두 개의 클래스 또는 모듈이 의존관계에 있다고 말할 때는 항상 방향성을 부여해줘야한다. A가 B에게 의존하고있다. B가 변하면 A에 영향을 미친다. B의 기능이 추가, 변경이 일어나면 그 영향이 A로 전달된다. A에서 B에 정의된 메소드를 호출해서 사용하는 경우다. B에 새로운 메소드가 추가되거나 기존 메소드의 형식이 바뀌면 A도 그에따라 수정되거나 추가돼야 한다. B의 형식은 그대로지만 기능이 내부적으로 변경되면 결과적으로 A의 기능이 수행되는 데도 영향을 미친다. 방향성이 있다. B는 A의 변화에 영향을 받지 않는다. A가 인터페이스 B에게 의존하고있다. 인터페이스 B가 변하면 A에게 영향을 주겠지만, 중요한 것은 인터페이스 B를 구현한 클래스가 변하더라도 A에게 영향이 주지 않는다는 사..

    Read more
  • Copyright 2024. GRAVITY all rights reserved