본문 바로가기

스프링

(20)
스프링 테스트시 테스트의 application.yaml을 자동으로 못읽을때 스프링 테스트의 기본동작은,@SpringBootTest가 있으면 자동으로 resources에 있는 application.yml을 읽는다근데 만약 application.yaml일경우 못읽으니(yaml이 아닌 yml이어야함) 이름을 바꿔주자
코틀린 스프링으로 dotenv를 사용해서 중요비밀정보 분리하기 도커를 사용할때는,환경변수주입으로 값을 받아서 쓰는게 아무래도 편리하다jar로 말때도 따로 뭐 신경쓰지않아도 되고비밀정보도 어플리케이션이 가지고있을 필요도 없어지고 근데 로컬에서는 아무래도 환경변수를 사용하면 불편하다(물론 인텔리제이단에서 주입할수있긴하다)그냥 config.properties를 쓴다고 하면build.gradle에bootJar { exclude 'config.properties'}를 추가해서 jar로 말릴때 해당파일을 제거하고application.yaml에spring: config: import: optional:classpath:config.properties로 해당파일이 존재할때만 읽어오게 한다음에 도커컨테이너 실행시나,도커파일로 말때 설정해도 된다 근데 build.grad..
스프링의 application.yaml과 중요비밀정보 가장 간단하게 분리하기 프로덕션레벨에서는 보통 빌드시에 AWS Parameter Store같은거로 환경변수를 주입받아서쓰지만,토이프로젝트에 그런걸 붙이긴 너무귀찮고 신경쓸거도 많다그래서 사용하는게 그냥 application.yaml에 하드코딩하는건데,이건 만약 github같은거로 형상관리를 할때,저걸 gitignore에 등록하는걸 까먹는다면,또는 중간에 추가적으로 시크릿키같은걸 등록하고 gitignore에 등록했는데,이미 저장하던 파일의경우는 gitignore에 적어도 삭제하지않기때문에 그대로 db경로 아이디패스워드 등등 전부 퍼블릭에 노출되는 대참사가 난다이거뿐만 아니라 설정정보등을 git에 못올린다는거부터 좀 구멍뚫어서 저장하는 느낌이라 맘에 안들기도 하고 그래서 사용되는게 몇가지가 있는데,빌드시에 해당값을 하드코딩으로 변..
스프링 컨트롤러 테스트시 responseBody값 파싱하기(w.스프링 컨트롤러 리턴값 한글깨짐해결) 결과값을 던져주는 클래스는data class Result( val data: T,)이렇게생겼고테스트 통신으로 MockMvc를 사용하고,om을 사용할거임@SpringBootTest@Import(TestConfig::class)@AutoConfigureMockMvc@Transactionalclass MemberControllerTest @Autowired constructor( val mvc: MockMvc, val memberRepository: MemberRepository, val koreanStockRepository: KoreanStockRepository, ) { val om = ObjectMapper()그리고 평범하게 통신테..
스프링에서 특정 패키지 테스트에서 제외하기 클린아키텍처식으로 도메인부터 로직을 짜던가 하다보면,실행기가 없어서 테스트를 사용해서 실행시키고 테스트를 하는 경우가 많음(세부사항은 최대한 늦게 결정하려고)이럴때,전체 테스트에는 포함시키고싶지않은데 테스트에는 존재하는 그런 study라고 표현되는 테스트들이 생기게됨이런테스트들을 한 패키지에 몰아놓고build.gradle에tasks.named('test') { useJUnitPlatform() filter{ excludeTestsMatching("rkrk.whyprice.study.*") }}이걸 추가해주면(filter{...}말고 겉에는 이미 있을수도 있음) 저 해당되는 패키지는 전체테스트실행시 실행되지않고,개별테스트실행을 할때만 실행됨
spring ai의 openAiChatModel로 Perplexity같은 다른 회사와 통신하기 일단 주의점부터 말하고가면그냥 rest같은거로 통신하는게 더 깔끔할수있음서브클래싱으로 상속을 사용하고,슈퍼클래스보다 서브클래스가 기능이 적어지는등 리스코프치환원칙 위반인 코드임제대로 하려면 ChatModel부터 시작해서 다 만드는게 정석적인 방법같음같은 문제점이 있는 코드임일단 가능은 하다는데 의의를 두겠음완성코드는 맨밑에 있으니 과정 안궁금하면 맨밑으로 내려가면됨 일단 배경스토리부터 말해보자면나는 이미 SpringAi로 OpenAi의 gpt로 통신하는 코드가 다 짜여져있었음근데 스토리상 웹검색을 하고 그 결과를 바탕으로 출력을 해야해서 gpt로 웹검색을 해야했는데,내가 웹 검색해서 던져주거나 하는거는 토큰이 얼만큼 튈지도 가늠이 안되고,크롤링을 하면 막힐테니 api로 해야하는데 api비용도 만만찮고(S..
스프링 UriComponentsBuilder로 공공데이터포탈 키 인코딩하기 이상한거로 3시간 잡아먹었다결론과 코드는 맨밑이니 걍 맨밑에가서 메서드복사해다가 써도됨 기본적으로 https://datatracker.ietf.org/doc/html/rfc3986#section-2.2 에 규정된대로,/나 +등 예약된 문자들은 따로 인코딩하지않아도 url에 사용할수있고,그래서 UriComponentsBuilder는 저런값들을 인코딩하지 않는다근데 문제는 공공데이터포탈의 키는 이걸 인코딩해야한다문제는 더있는데,만약 그래서 인코딩된 키를 사용하려고 하면,인코딩이 됐으니 %가 들어있어서 다시 인코딩이 된다 즉GTFN0/s1 이게 인코딩하기전,즉 디코딩키라면GTFN0%2Fs1 정상인코딩은 이거고GTFN0%252Fs1이중인코딩은 이거다 즉 %가 두번 인코딩되면 %25가 추가되는거다(  / -> %..
spring AI gradle 의존성 추가 방법 1.레포지토리 추가repositories { mavenCentral() maven { url 'https://repo.spring.io/milestone' }//ai 디펜던시 조회장소 추가} maven { url 'https://repo.spring.io/milestone' }  만 추가(mavenCentral()은 원래있을거임)2.버전변수추가(안하고 그냥 바로 적어도되긴함ext { set('springAiVersion', "1.0.0-M1")//밑에서 사용할 버전 변수}추가3.bom추가dependencyManagement { imports { mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}" }..