프로젝트 (14) 썸네일형 리스트형 [Spring] 어노테이션 기반 커스텀 인증 시스템 구현 서론 소프티어 부트캠프에서 진행된 프로젝트에서는 Spring Security를 사용할 수 없어 직접 인증 시스템을 구현해야 했다. 인증 시스템의 본질은 사용자가 특정 자원에 접근하려고 할 때 해당 사용자가 접근 권한이 있는지 검사하는 것이다. "사전"에 검사한다는 측면에서, 스프링은 아래와 같은 다양한 방식으로 인증을 구현할 수 있다.Spring InterceptorSpring AOPServlet Filter 요구사항이 없다면 어떤 방식으로 구현하더라도 상관 없지만, 현재 팀 프로젝트는 ControllerAdvice을 이용해 서버에서 발생하는 모든 예외를 잡아 동일한 규격의 메시지를 반환하도록 설계되어 있으며, 인증 시스템 역시 ControllerAdvice의 예외처리에 의해 관리되게 구성하고 싶었기에 .. [Spring] JPA Specification과 한계 결론현재 글이 작성된 시점 ( 2024.09 ) 에서는 hibernate가 fetch graph 기반 field projection을 지원하지 않는다. JPA Specification은 fetch graph 기반으로 projection을 처리하므로 JPA 구현체로 hibernate을 이용하고 projection이 필요하다면 QueryDSL을 이용하는 것이 더 적합할 수 있다.연관 관계를 fetch하는 작업은 Specification 내부가 아니라, findBy 메서드에서 project 힌트를 줘서 처리할 수 있다.Page userPage = eventUserRepository.findBy( searchSpec, (q) -> q.project("eventFrame").page(pa.. [spring] swagger와 관련된 설정들 프로젝트에서 Swagger을 이용하면서 알게 된 설정들을 정리한다.https://github.com/blaxsior/Team6-AwesomeOrange-BE GitHub - blaxsior/Team6-AwesomeOrange-BE: 현대자동차그룹 소프티어 부트캠프 6조 어썸오렌지 팀 프로젝트현대자동차그룹 소프티어 부트캠프 6조 어썸오렌지 팀 프로젝트 (fork). Contribute to blaxsior/Team6-AwesomeOrange-BE development by creating an account on GitHub.github.comJavadoc 함께 사용하기https://springdoc.org/#javadoc-support나는 여러 사람과 협업하는데 있어서 주석의 역할이 상당히 중요하다고 생.. [spring] Spring Message Rest API와 사용 thymeleaf과 같은 뷰 템플릿을 이용할 때는 자동으로 코드를 대응되는 메시지로 변경해주지만, rest api 형식으로 구현하게 되면 이러한 편의성이 제공되지 않는다. Spring 입장에서는 사용자가 정말 응답에 국제화를 제공하고 싶은지 알 방법이 없기 때문에 당연한 것 같긴 하다.Rest API에서 예외 메시지 등을 국제화하고 싶다면 필요한 위치에 MessageSource을 주입받아 사용한다. Spring boot을 이용하면 MessageSource는 기본적으로 MessageSourceAutoConfiguration 설정을 통해 Bean 등록 되어 있으므로 별도로 설정하지 않아도 된다.사용한 설정은 다음과 같다.spring: config: import: optional:secrets.yml .. [소프티어부트캠프] 파일 업로드 & 공백 제거의 위험성 소프티어 부트캠프에서 파일 업로드 중, 특정 webp 파일이 깨지는 문제가 발생했다. 기존 코드 베이스는 다음과 같다.StringBuilder partBodyStr = new StringBuilder();char[] bodyBuffer = new char[1024];while((br.read(bodyBuffer)) != -1) { partBodyStr.append(bodyBuffer);}byte[] partBody = partBodyStr.toString().trim().getBytes(StandardCharsets.ISO_8859_1);FormDataUtil.addFormData(req, partName, new FormItem(filename, partBody));Stringbuilder.. [기록] JWT 로그인 & redis Redis https://redis.com/ Remote Dictionary Server의 약자로, key - value 형식의 데이터를 저장하는 NoSQL DBMS의 일종이다. 메모리 기반으로 동작하기 때문에 속도가 매우 빠르다는 것이 장점이다. 우리가 아는 많은 데이터베이스들은 파일시스템에 데이터를 저장한다. CPU는 메모리에 올라온 데이터만 읽을 수 있으므로 특정 데이터를 요구하려면 파일 시스템 → 메모리 → CPU의 과정을 거쳐야 하는데, redis는 파일 시스템 접근이 없으므로 속도가 매우 빠르다. 파일 시스템 상에 백업하는 기능도 지원한다. 다양한 요구사항을 만족할 수 있도록 여러 가지 자료구조도 기본으로 제공한다. https://redis.com/redis-enterprise/data-str.. [기록, typeorm] ROW NUMBER + 서브쿼리로 대표 댓글 가져오기 ORM이 지원하는 메서드들이 편리하긴 하지만, 쿼리가 조금만 복잡해지면 직접 SQL 문을 작성해야 하는 경우가 많다. 최근 진행되는 팀 프로젝트에서 댓글을 가져오기 위해 TYPEORM이 지원하는 간단한 메서드 수준에서는 처리할 수 없는 동작이 요구되었다. 요구사항은 다음과 같다. 감정 별 대표 댓글 가져오기: 특정 기간(from, to) 내 감정 별로 공감 수가 최대인 댓글 하나씩 가져온다. 요점은 1. 특정 기간 내, 2. 감정 별, 3. 공감 수 최대에 있다. 감정 별로 묶은 후 공감 수에 대한 순위를 따져야 하므로 ROW_NUMBER을 이용해야 하는데, TYPEORM 수준에서 지원되는 기능은 아니므로 querybuilder을 이용하여 SQL문에 가까운 쿼리를 작성할 필요가 있다. 위 요건을 SQL문.. [기록] AWS EC2 / Docker 환경 마련하기 현재 진행 중인 졸업 프로젝트에서 나는 데이터 수집 파이프라인 구축 역할과 API 서버 구축 역할을 맡았다. 이 글에서는 API 서버를 실제 환경에 배포하기 위한 첫 단계로 EC2 + Docker 환경을 마련해 본다. 추가적으로 탄력적 IP에 대해 알게 된 점을 설명한다. 내가 달성하고 싶었던 목표는 다음과 같다. EC2 환경에서 docker을 운영한다. 도메인 명을 기반으로 api 서버에 접근한다. 도메인을 구매하고 실제 환경에 연결한다. 경로에 접근할 때 https을 적용한다. http로 접근하는 경우 https로 redirection한다. 1번과 2번은 과거 프로젝트를 통해 경험해 본 적이 있었다. 다만 당시에는 클라우드에 대해 잘 이해하지 못하고 있던 상태였기 때문에, 다시 되짚어보자는 마음으로 .. 이전 1 2 다음