경험/회고

백엔드 개발 중 나만의 규칙

개발을 할 때 유지보수하기 쉽게, 남이 봤을 때 직관적이게, 그렇지만 깔끔하게 구성하려고 노력해 봤다. 컨트롤러에서 어떤 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..

경험/기술

[Spring] [Kotlin] - S3에 파일 업로드/다운로드

IAM S3가 구성되었다면(S3가 없다면? - S3 버킷 생성) 이제 S3에 접근하기 위해서 IAM 계정을 생성해줘야 한다. IAM 계정 생성 사용자 이름은 구분할 수 있게 마음대로 지정하면 된다. 액세스 권한은 선택해도 되고 안 해도 된다. 여기서는 S3를 접근하기 위해 만드는 것이라 선택하지 않았다. 권한은 S3FullAccess권한을 부여했다. 여기서는 직접 연결을 했지만 정책을 그룹에 연결한 후 사용자를 적절한 그룹에 추가하는 것을 권장하고 있다. 태그는 굳이 생성하지 않았다. (필요시에 생성하면 됨) 사용자 생성을 누르면 잘 생성되었다. 여기서 이제 애플리케이션에서 S3로 접근하기 위해 필요한 key를 발급받아야 한다. 액세스 키 발급 만든 IAM 유저를 들어가서 > 보안 자격 증명 탭에 가보면..

경험/기술

[S3] AWS S3 버킷 생성

S3 프로젝트를 하다가 PDF를 어딘가에 저장해야 하는 일이 생겨서 S3 버킷에 저장해보려고 한다. 그래서 우선 S3를 생성해 보겠다. (AWS계정이 없다면 만들고 와야 한다.) 버킷 생성 Amazon S3 버킷을 생성해 보자. 버킷 이름은 알아볼 수 있도록 마음대로 설정해 주면 된다. AWS 리전은 속도를 위해 많이 사용될 지역으로 설정해 주는 게 좋다. AWS S3 버킷에서 객체(파일)의 소유권은 업로드를 수행한 IAM 사용자(계정)에게 자동으로 할당된다. 객체의 소유권은 기본적으로 업로드한 IAM 사용자에게 속하게 된다. ACL(Access Control List)은 AWS S3 버킷의 객체에 대한 액세스 권한을 관리하는 기능이다. ACL을 활성화하면 업로드된 객체에 대한 액세스 권한을 미리 정의된..

경험/회고

기술 블로그 작성

이모저모 사람들에게 유익한 글, 사람들이 많이 궁금해할 만한 글, 쉽게 해보지 못한 경험(대용량 데이터를 처리했던 경험, 장애가 났을 때 대응했던 경험 등)을 적어야겠다는 막연한 생각을 하고 블로그를 시작했었다. 그런데 막상 블로그를 시작하고 나니 그게 쉽지 않고 재료(소스, 경험)도 부족했다. 블로그를 어떻게 시작해야 할까? 어떤 주제로 써야 할까? 많은 블로그 입문자 고민하는 주제일 것 같다. 나는 부딪히고 생각하자는 주의기 때문에 지금 듣고 있는 강의를 다시 정리하면서 공부하자는 느낌으로 블로그를 작성했다. 마침 회사 스터디에서도 자신이 공부했던 주제를 발표하는 방식의 스터디를 진행했기에 블로그를 기반으로 발표를 하면 일석이조였다. 블로그는 공개된 장소인데 강의내용을 정리하는 나만의 글을 쓰는 게 ..

경험/회고

Tistory 시작

이모저모 이번주는 나에게 많은 변화가 있던 주다. 공부도 보다 체계적으로 하기 위해 노력하고 계획도 세워서 나태해지지 않게 나를 움직이게 하고 있다. (TMI: 운동도 시작했다!) 블로그에서도 변화를 주었는데 Velog가 쓰기 쉽고 편해서 Velog로 시작했는데 Velog에 대한 한계가 너무 많이 느껴졌고, 가장 큰 이유 중 하나는 UI가 마음에 들지 않았다.. 그래서 Tistory에 하루동안 영혼을 갈아서 스킨도 적용하고 이것저것 보면서 나름 꾸몄더니 보기 좋아졌지만 아직 난 더더 고프다. 나중에는 꼭 메인 페이지도 인파_님처럼 꾸밀 것이다. 그리고 TIL을 하려고 했지만 일하면서 매일매일 블로그를 쓴다는 게 쉽지 않아서 TIL은 노션에 간단간단하게 정리하고 회고식으로 블로그에 정리하려고 한다. 지금 ..

호야_
'경험' 카테고리의 글 목록 (3 Page)