Spring Boot 의 동작 방식
·
Backend/Spring Boot
이번 시간에는 스프링과 스프링 부트가 무엇이며, 스프링 부트는 어떻게 동작하는 지에 대한 공부를 해보겠습니다.스프링 부트의 기본 의존성 중 하나인 spring-boot-starter-web 모듈을 사용하면, 기본적으로 내장 톰캣을 사용하는 스프링 MVC 구조를 기반으로 동작합니다. 클라이언트의 요청이 들어오면 서블릿이 이를 처리해야 하는데, 서블릿은 서블릿 컨테이너에서 관리하고, 톰캣이 서블릿 컨테이너의 역할과 WAS 역할을 담당합니다. 서블릿(Servlet)클라이언트의 요청을 처리하고, 결과를 반환하는 자바의 웹 프로그래밍 기술입니다. 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리합니다. 서블릿 객체는 싱글톤 패턴으로 관리되며, 멀티 스레딩을 지원합니다.   DispatcherServl..
Ngrinder를 활용한 성능 테스트 (localCache)
·
Backend/Spring Boot
캐시(Cache)캐싱은 어디에 적용할 수 있을까?변화가 많지 않은 데이터를 매번 DB에서 데이터를 조회해서 보여주는 것이 비효율적인 경우자주 조회되는 데이터캐시를 사용하면 얻는 점은?읽기(조회) 성능을 향상할 수 있다.RDB의 경우, Disk에 접근해야 하기 때문에 상대적으로 연산 수행이 오래 걸린다. 반면 Redis와 같은 캐시는 메모리에서 동작하기 때문에 상대적으로 빠르게 연산을 수행할 수 있다.무작정 캐시를 적용하면 좋을까?아무데서나 다 사용한다고 좋은 것은 아니다. 데이터가 업데이트될 때 마다 캐시도 함께 업데이트 해주어야 하기 때문이다. 캐시에 데이터가 과하게 쌓일 경우, side effect가 발생할 수 있다.  Ngrinder 설치 및 환경 설정설치 : https://github.com/na..
Query did not return a unique result: 2 results were returned 에러 해결하기
·
Backend/Spring Boot
테스트 코드를 작성하다가 문뜩 이런 에러를 마주하였다. Query did not return a unique result: 2 results were returned 엥?.. 왜 2개의 결과값이 들어오지 ? 살펴보니 Repository에서 값을 받아오면서 생긴 문제였다. Optional findByIdentifer (string identifier); 해결 방법은 Optional이 아닌 List로 데이터를 받자! 쉽죠잉? Optional findByIdentifer (string identifier); // 변경 전 List findByIdentifer (string identifier); // 변경 후
Content type 'application/octet-stream' not supported 에러
·
Backend/Spring Boot
controller에서 multipartFile 타입의 이미지와 json 타입의 dto를 같이 받기 위해 requestpart를 사용하면서 만난 오류이다. dto는 requestbody를 통한 전달이 아닌 form-data로 전달을 해주어야 했고, 그 상황에서 json 타입의 데이터를 보내는 방식에서 문제가 생겼다. form-data 타입의 key-value 값으로 json을 보내줄 때는 content-type을 application/json으로 직접 명시해주자 !! 문제 해결 :)
DTO vs VO
·
Backend/Spring Boot
DTO : 데이터 전달용 = Data Transfer Object = 데이터를 전달하기 위해 사용하는 객체 = 데이터를 담아서 전달하는 바구니 - 오직 getter/setter 메서드만을 갖는다. setter를 사용하지 않고 생성자 메서드를 사용한다면 불변 객체로 만들어 중간에 데이터 위변조를 막을 수 있다. - 다른 로직을 갖지 않는다. - DTO class와 Entity class를 분리하라. VO : 값 표현 = Value Object = 값 그 자체를 표현하는 객체 - VO의 경우 값 그 자체를 나타내는 객체로써, 핵심은 필드 값이 같다면 두 객체를 같은 객체로 본다는 것이다. 이때 당연하게도 주소값을 비교하는 경우의 문제점을 위해서 hashcode()와 equals()를 재정의하여 필드 값이 같..
prepareKotlinBuildScriptModel Task fails in a Java project 오류 해결
·
Backend/Spring Boot
tasks.register("prepareKotlinBuildScriptModel"){ } build.gradle에 추가해주기 ! 해결 완!
spring에 swagger 적용하면서 겪은 3가지 에러 해결하기
·
Backend/Spring Boot
스프링 2.X.X 특정 버전 이후로 Swagger2:2.X.X 버전 실행 에러 발생 해결 -> build.gradle파일의 springfox ~ 버전들을 모두 3.0.0 으로 바꿔준다. // Swagger Lib implementation 'io.springfox:springfox-swagger2:3.0.0' implementation 'io.springfox:springfox-swagger-ui:3.0.0' implementation 'io.springfox:springfox-boot-starter:3.0.0' org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrap..
mvnrepository 사용법
·
Backend/Spring Boot
1. https://mvnrepository.com/ 접속 2. 필요한 API 또는 라이브러리 검색 3. 사용할 버전 선택 4. Maven에 있는 코드 복사 후 스프링 프로젝트의 pom.xml에 추가 5. 끝 ! 간단합니다.
무료 API들
·
Backend/Spring Boot
발할때 유용하게 써먹을만한 무료 API들입니다. 토이 프로젝트 할때 요긴히 사용 할 수 있을 것 같습니다. JSON Placeholder (https://jsonplaceholder.typicode.com/) : 테스트용 가짜 데이터를 제공하는 API. Google Translate (https://cloud.google.com/translate/docs/) : 한달에 50만 요청까지 무료로 사용 가능한 번역 API. Open Weather Map(https://openweathermap.org/api) : 날씨 정보를 제공하는 API. REST Countries ((https://restcountries.com/) : 나라 정보를 제공하는 API. 나라 이름, 수도, 인구, 통화, 언어 등등. IP A..
쿼리 파라미터 로그 남기는 방법
·
Backend/Spring Boot
방법1. application.yml 파일에서 다음과 같이 설정 logging : level : org.hibernate.type : trace 2. 외부 라이브러리 사용하기 (p6spy) 스프링부트를 사용하면 이 라이브러리만 추가하면 된다. implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' https://github.com/gavlyukovskiy/spring-boot-data-source-decorator GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-poo..
@Configuration과 ComponentScan에 대한 궁금증 타파
·
Backend/Spring Boot
package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration //ComponentSacn은 bean을 전부 검색해서 담는 과정을 수행함, 정확히는 @Componet가 붙은 녀석들을 전부 담아줌 @ComponentScan( //AppConfig에 등록한 Configuration을 제외해주는 과정 excludeFilters = @ComponentScan.Filter(type = Filter..
assertThat 라이브러리 추가하기
·
Backend/Spring Boot
dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' testImplementation 'org.assertj:assertj-core:3.11.1' // assertThat 을 쓸 수 있게 해주는 라이브러리 } build.gradle 파일 수정하면 버튼이 활성되는데 그걸 꼭 눌러야 반영이 된다.