분류 전체보기202 코드 리팩토링 1 - 코드 정리, 가독성 증가 구조 정리 1. 수 많은 dto들의 위치를 정리하였다. 현재 우리의 프로젝트는 MSA 구조이기 때문에, 서로의 동작을 약속하고 개발 과정은 완전히 독립적이다. 남이 보기에도 명확하게, 한눈에 보기 쉽게 DTO를 정리하였다. 2. SERVICE가 아닌 METHOD 단위의 분할을 진행하였다. 설계 과정에서 SERVICE의 범위를 최대한 세밀하게 분리하자는 생각에 따라 각 SERVICㄷ들이 1개의 메소드를 지니게 아주 잘게 서비스를 분할하였는데, 리팩토링 과정에서 해당 과정에 따른 높은 결합도의 문제에 대한 의견을 들었다. 전체적인 결제의 검증과 저장을 한 SERVICE로 묶었다. 해당 SERVICE들은 사실 메소드의 개수가 많지 않기 때문에 분할하여도 되었지만, 서비스의 범위 자체가 요청을 보내는 부 , 요.. 2024. 4. 18. SQL 3 문자열 자르기 CONCAT을 사용한다. CONCAT의 사용은 익었지만, SUBSTR이 아직 손에 익지 않았다. SUBSTR(문자열, INDEX 시작번호, 갯수)로 , 해당 문자열을 자를 수 있다. SUBSTRING의 줄임말로써, 문자열을 줄여서 새로운 문자열을 만든다. DATE_Format 내가 자주 하는 실수 . YYYY-MM-DD로 표현하려고. DATE_FORMAT에 'YYYY-MM-DD'를 적곤 한다. %로써 표현함을 까먹지 말자. 2024. 4. 16. 1차 완성, 코드 리뷰 1차적으로 프로젝트가 완성 되었다. https://github.com/stophyeon/Darakbang.git GitHub - stophyeon/Darakbang: 오픈 마켓 서비스 오픈 마켓 서비스. Contribute to stophyeon/Darakbang development by creating an account on GitHub. github.com 우리가 원하던 대로 , Spring Cloud, API GATEWAY 등을 활용하여 MSA 구조의 마켓의 구축을 성공했다. 해당 구축 이후엔 코드 리뷰를 진행했다. 사실 코드 리뷰라는 기회 자체가 정말 얻기 쉽지 않은 기회이지만, 다행히도 팀장역할을 하신 분의 지식이 깊어 코드 리뷰를 받을 수 있었다. 코드 리뷰 내용 1. 가독성이 너무 떨어진.. 2024. 4. 16. 고난이도 구현 문제 import math def solution(fees, records): timeleft = {} for i in records: time,carnum,state = i.split() if carnum not in timeleft.keys() : timeleft[carnum] = fees[0]#기본 주차 가능 시간 parkinglot = [] timeremember = {} for i in records: time,carnum,state = i.split() realtime = int(time[0:2])*60 + int(time[3:]) if state == "IN" : parkinglot.append(carnum) timeremember[carnum] = realtime else : #나갈때가 되었어요.. 2024. 4. 14. Spring Security (MSA)를 하며 만난 문제들 현재 우리 프로젝트 구조는 ApiGateway -> Eureka확인 -> 후 해당 service들에게 요청을 보내는 형식이다. 즉, ApiGateway에서 jwtfilter를 통한 인증,인가를 하고 있다. 프로젝트 과정에서 MSA 구조로 프로젝트를 올려야 했고, 이 과정에서 인증 문제가 발생해 계속 401 UNAUHTORIZED가 발생했다. 이를 해결해보자 . JWTFILTER만 있는것이 아니다. JWTFILTERCHAIN 뿐만 아니라, CORS, 기본 SecurityFilter등이 존재한다. @Configuration @EnableWebSecurity public class SecurityConfig { private final JwtProvider jwtProvider; private final Me.. 2024. 4. 8. RESTFUL URL 규칙 + 협업시 지켜야 할 것들 프로젝트를 진행하며, 혼자 개발 했던 경험과는 큰 차이가 있음을 배우고 있다. 그 과정에서 배웠던, URL 규칙을 정리하고자 한다 . URL 규칙 1. 소문자를 사용하자. 대문자는 가끔 문제가 발생되기도 한다. 2. 마지막이 /로 끝내지 않게 하자 3. 동사를 지양하자. 동사를 사용하면 사용자가 지금 어떤 행위를 하고있는지 직접 확인이 가능하다. 지양하고 GET, POST, PUT , PATCH등을 활용하여 해당 내용을 전달하자 4. BACKEND에 관련된 내용인데, REQUESTPARAM과 PATHVARIABLE의 활용엔 고민하자. 사실 둘다 URL의 전달이 목적이 되면, 어떤것을 사용해도 기능상 문제가 되는 경우는 많지 않다 (하지만, PATHVARIABLE은 하나만 가능하다는 단점도 있기는 하다. .. 2024. 4. 6. @builder/ 모든 생성자 정보처리기사를 공부하며 , 빌더 패턴이라는 패턴을 확인하였다. 실제로 프로젝트를 위한 협업을 진행하며 @builder라는 어노테이션을 확인하였고, 어떨때 생성자 대신 해당 @builder를 사용하는지, 그 이유는 무엇인지 정리하기로 하였다. @builder의 장점 @Table(name = "product") @Entity @Getter @RequiredArgsConstructor @AllArgsConstructor public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "product_id") private Long productId ; @Column(name = "product_name") .. 2024. 4. 3. DELETE , UPDATE 쿼리 관련 동시성 문제 문제점 : 상품을 작성하던 중 PAGIGNG 혹은 조회 과정에서 글이 삭제 되거나 , 수정되었을 때는 어떻게 진행할지에 대한 의견이 나왔다. 단순히 상품, 전체 만을 조회 할 때는 글이 삭제 수정되는 것만으로 그칠 수 있는 문제지만 후에 해당 상품을 구매하는 경우에는 구매 도중 글을 삭제하거나 취소할 수 있다는 문제까지 유발 될 것으로 예측되어 해당 부분에 대한 고민을 생각했다. 생각한 해결방안 : 각 요청시마다 검사 너무 많은 요청과 잦은 검사가 필요하게 된다. 또한 DATA의 문제를 BACKEND단에서 모두 검증하는 방식이, DATA는 DB영역에서 관리하고 서비스는 BACKEND 영역에서 관리하는 분리에 대한 개념에서 벗어났다고 느꼈다. 낙관적 LOCK(S-LOCK) 구매 과정에서, 특히 DB의 VE.. 2024. 3. 30. SQL 2 MYSQL 에서 TOP 대신 사용 하는 방법 TOP 함수를 생각했지만, 해당 함수는 SQL SERVER에서의 기능이었다.ORDER BY로 원하는 기준에 따라 정렬하고, LIMIT를 통해 그 중 몇개를 얻어낼 것인지 정한다. 재귀 쿼리 없는 데이터를 0으로 변경해야 하는 문제 . with recursive time as (select ㅁ uninall select ㅁ조건에 맞는 추가내용 where절에, 재귀의 조건을 정한다. ) 이후 left outer join을 통해, 해당 테이블과 합친다. 조건1. 넣고자 하는값, 그리고 1로 시작하는 값을 명명하여 넣는다(WHERE 또한 최초 시작 조건을)2. UNION ALL3. 해당 RECRUSIVE TABLE에서, 그 명명한 값 +1 을 재명명한다. 결과.. 2024. 3. 30. Spring에서 동시성 test # 현재 문제가 되었던 부분은, 상품을 조회하는 도중에 상품을 삭제하는 부분(수정도 마찬가지이다)에 대한 부분이었다. 이를 위해, 상품을 조회하는 도중에 상품을 삭제하는 동시성 문제에 대한 test 코드를 작성하도록 하겠다. @Test public void testDeleteProductAndThenFind() throws InterruptedException { // Given Long productId = 1234L; String userEmail = "test@naver.com"; Product product = new Product(productId, "Test Product", 100, "aGVsbG8gd29ybGQ=".getBytes(), "aGVsbG8gd29ybGQ=".getBytes(),.. 2024. 3. 29. 이전 1 2 3 4 5 6 7 ··· 21 다음