안녕하세요😊

아는 것만 보이는 게 아닌, 아는 만큼 보인다고 생각하는 백엔드 개발자입니다.
경험/이슈

서버 환경 구축 중 만난 이슈 정리

먼저 이 문제는 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책을 실습하는 과정에서 마주친 상황이다. 책은 몇 년 전에 지어진 기준이라 자바나 스프링부트의 버전이 낮게 되어있다. 그렇지만 그 당시 버전보다는 지금 상황에서 안정된 최신 버전으로 변경사항은 고치며 해보고 싶어 최신버전으로 진행했다. Spring Boot : 3.1.2 Java : 17 Gradle : 8.2.1 EC2 pem키를 ppk파일로 변환 [p.252] puttygen을 사용해서 pem키를 ppk파일로 변환할 수 있고, 과거에는 그렇게 했다. 이제는 그럴 필요 없이 아래의 그림과 같이 ppk를 받으면 된다! 당연히 이렇게 했겠지만 처음 접한 사람은 무심코 놓칠 수도 있기에 정리했다. CodeDeploy 에이전트 설치 실패 ..

경험/이슈

Spring Security 버전 이슈로 인한 오류 해결

먼저 이 문제는 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책을 실습하는 과정에서 마주친 상황이다. 책은 몇 년 전에 지어진 기준이라 자바나 스프링부트의 버전이 낮게 되어있다. 그렇지만 그 당시 버전보다는 지금 상황에서 안정된 최신 버전으로 변경사항은 고치며 해보고 싶어 최신버전으로 진행했다. Spring Boot : 3.1.2 Java : 17 Gradle : 8.2.1 spring-security-config : 6.1.2 우선 책에서는 @RequiredArgsConstructor @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { private final CustomOAuth2UserS..

경험/이슈

SpringBoot 버전 이슈로 Mustache 한글 깨짐

결론으로 바로 가기 먼저 이 문제는 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책을 실습하는 과정에서 마주친 상황이다. 책은 몇 년 전에 지어진 기준이라 자바나 스프링부트의 버전이 낮게 되어있다. 그렇지만 그 당시 버전보다는 지금 상황에서 안정된 최신 버전으로 변경사항은 고치며 해보고 싶어 최신버전으로 진행했다. Spring Boot : 3.1.2 Java : 17 Gradle : 8.2.1 문제 상황 스프링 부트에서 공식 지원하는 템플릿 엔진 Mustache를 사용하던 중 이렇게 한글이 깨지는 현상이 발생했다. 결론 스프링 부트 2.7.X 버전 이상부터는 한글 깨짐이 발생한다. 스프링 부트 버전을 2.7.0 이하로 낮추거나 버전을 낮추지 못한다면 //aplication.properties ..

경험/이슈

Gradle 버전 이슈로 Lombok이 안 됨

결론으로 바로 가기 먼저 이 문제는 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책을 실습하는 과정에서 마주친 상황이다. 책은 몇 년 전에 지어진 기준이라 자바나 스프링부트의 버전이 낮게 되어있다. 그렇지만 그 당시 버전보다는 지금 상황에서 안정된 최신 버전으로 변경사항은 고치며 해보고 싶어 최신버전으로 진행했다. Spring Boot : 3.1.2 Java : 17 Gradle : 8.2.1 (Gradle은 신경 못 썼지만 이거 때문에 문제가 있었다..) 문제 상황 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.projectlombok:lombok' imple..

경험/회고

백엔드 개발 중 나만의 규칙

개발을 할 때 유지보수하기 쉽게, 남이 봤을 때 직관적이게, 그렇지만 깔끔하게 구성하려고 노력해 봤다. 컨트롤러에서 어떤 API인지 직관적으로 나타내보자. 우선 api문서를 작성하던 어떤 메서드가 있는지 확인하던 컨트롤러를 가장 먼저 보게 될 것이다. 물론 함수명이나 컨트롤러에 작성된 로직들로만 이게 어떤 역할을 하는 api인지 알면 좋지만 그렇지 못할 수도 있기에 주석을 작성해 봤다. @RestController @RequestMapping("resource") class ResourceController( private val resourceService: ResourceService ) { /** 페이징 API **/ @GetMapping("/list") fun loadPagedResource( @..

경험/기술

[Spring] [Kotlin] [MongoDB] 엑셀 다운로드

요구사항 대용량 데이터 엑셀 다운로드 파라미터에 따라 동적으로 조건이 바뀌게 해야 함 DB: MongoDB 방법 구상: 스트림 방식으로 데이터를 뽑아오고 ➜ 엑셀을 스트림으로 채우고 ➜ 엑셀 내보내기 구현 알아보니 스프링부트에서는 엑셀기능을 구현할 때 poi라는 기능을 사용할 수 있다고 한다. // build.gradle implementation('org.apache.poi:poi-ooxml:5.2.2') Repository interface CustomRepository { fun streamSearch(requestDto: RequestDto): Stream } @Repository class CustomRepositoryImpl(@Autowired private val mongoTemplate: ..

경험/기술

[Kotlin] let, run, apply, also, with 파헤치기

코틀린에는 객체의 컨텍스트에서 코드를 실행하기 위한 몇 가지 범위 지정 함수가 있다. let `let` 함수는 주로 null이 아닌 객체에 대한 코드를 실행하거나, null 가능성이 있는 변수와 작업을 할 때 사용한다. 람다는 'it' 키워드를 통해 호출된 객체에 접근하며, 람다 내부의 마지막 표현식을 반환한다. fun main() { val listWithNulls: List = listOf("A", null) for (item in listWithNulls) { item?.let { println(it) } // prints A and ignores null } } // 실행 결과 A run `run` 함수는 람다 내에서 수신 객체('this')에 대한 작업을 수행한 후, 람다 내부의 마지막 표현식을..

경험/이슈

Kotest BehaviorSpec에서 transaction rollback 안 됨

결론 import io.kotest.extensions.spring.SpringTestExtension import io.kotest.extensions.spring.SpringTestLifecycleMode import org.springframework.transaction.annotation.Transactional @SpringBootTest @AutoConfigureMockMvc @Transactional class SomeControllerTest( private val mockMvc: MockMvc, private val objectMapper: ObjectMapper, ) : BehaviorSpec({ extensions(SpringTestExtension(SpringTestLifecycl..