묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[UI3 업데이트] 피그마 배리어블을 활용한 디자인 시스템 구축하기
아이콘 Union 관련 질문
위 그림처럼 Feather Icon에서 가져온 아이콘을 Union하면 형태가 변하는 경우가 나타납니다. 이런 경우 "Union을 해도 원래 형태를 유지할 수 있는 방법"이 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
RestDocs에서의 SpringSecurity Issue
public class FollowControllerDocsTest extends RestDocsSupport { private FollowService followService = mock(FollowService.class); @Override protected Object initController() { return new FollowController(followService); } private final Long loginUserId = 1L; @DisplayName("팔로우 수행 API") @WithUserDetails @Test public void startFollow() throws Exception { // Given StartFollowRequestDto requestDto = StartFollowRequestDto.builder() .followerId(loginUserId) .followingId(123L) .build(); BDDMockito.doReturn(StartFollowResponseDto.success()) .when(followService) .follow(any(StartFollowRequestDto.class)); //when,then mockMvc.perform( post("/api/follow/start-follow") .with(csrf()) .content(objectMapper.writeValueAsString(requestDto)) .contentType(MediaType.APPLICATION_JSON) ) .andExpect(status().isOk()) .andDo(document("start-follow", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields( fieldWithPath("followerId").type(JsonFieldType.STRING) .optional() .description("팔로워 아이디"), fieldWithPath("followingId").type(JsonFieldType.STRING) .optional() .description("팔로잉 아이디") ), responseFields( fieldWithPath("code").type(JsonFieldType.STRING) .description(ResponseCode.SUCCESS), fieldWithPath("message").type(JsonFieldType.STRING) .description(SUCCESS) ) )); } } FollowController@RestController @RequestMapping("/api/follow") @RequiredArgsConstructor public class FollowController { private final FollowService followService; @PostMapping("/start-follow") ResponseEntity<? super StartFollowResponseDto> startFollow( @RequestBody @Valid StartFollowRequestDto requestBody, @AuthenticationPrincipal PrincipalDetails principalDetails ) { Long loginId = principalDetails.getUser().getId(); Long userId = requestBody.getFollowerId(); if (loginId != userId) return StartFollowResponseDto.certificationFail(); ResponseEntity<? super StartFollowResponseDto> response = followService.follow(requestBody); return response; } }RestDocsSupport @ExtendWith(RestDocumentationExtension.class) public abstract class RestDocsSupport { protected MockMvc mockMvc; protected ObjectMapper objectMapper = new ObjectMapper(); private final Long loginUserId = 1L; @BeforeEach void setUp(RestDocumentationContextProvider provider) { User user = mock(User.class); when(user.getId()).thenReturn(loginUserId); PrincipalDetails userDetails = mock(PrincipalDetails.class); when(userDetails.getUser()).thenReturn(user); SecurityContext context = SecurityContextHolder.getContext(); context.setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, null, null)); this.mockMvc = MockMvcBuilders .standaloneSetup(initController()) .apply(MockMvcRestDocumentation.documentationConfiguration(provider)) .build(); System.out.println("beforeEach 수행"); } protected abstract Object initController(); } 안녕하세요. 강의 정말 유익하게 잘 듣고있습니다. 강의를 듣고 restdocs를 작성하던 중 문제가 발생하여 질문을 올립니다.제가 작성한 controller에서는 파라미터로 security.context 안에 있는 PrincipalDetails를 받아옵니다. 그렇지만 테스트에선 그 안에 값이 있는게 아니여서 Mock값을 넣어주어 @WebMvcTest 에서는 문제를 해결해 왔었습니다.문제는 restdocs를 작성하기 위한 테스트 코드에서 발생하였습니다. 이 테스트 코드에는 제가 적용한 PrincipalDetails 몫 이 넣어지지 않는 문제가 있었습니다.제가 생각하기론 SpringSecurity가 올라가지 않아서 그런 것 같은데 해결방법이 있으면 알고싶습니다 !
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
@Configuration WebMvcConfig클래스에대해
WebMvcConfig 클래스에 @Configuration애노테이션을 사용하면 addInterceptors 메서드에 @Bean을 달아줘야 동작할줄 알았는데 @Bean 애노테이션을 안달아줘도 잘 작동하는 이유가 궁금합니다.
-
해결됨Next + React Query로 SNS 서비스 만들기
dayjs 플러그인 질문있습니다.
dayjs를 사용하시기전에 dayjs.locale("ko"); dayjs.extend(relativeTime); 이렇게 쓰셧는데 dayjs를 매번 쓸때마다 컴포넌트에서 위코드가 들어가야하는지 궁금합니다.
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
HelloJava 실행 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]HelloJava에서는 실행이 잘 되는데 새로만든 class의 HelloJava2에서는 오류가 나면서 실행이 안되는데 어떻게 해야하나요 ? 버전문제는 아닌것 같습니다 ㅠㅠ
-
해결됨Teams에 이용중인 다른 서비스들을 연결해 편하게 업무하기
선생님 신규 팀즈에는 커넥터가 안보입니다.
선생님 강의 감사합니다 .1독하였습니다.강의 중에 구글 analytics 커넥터 연결하는 부분이 있었는데요.. 신규 팀즈에는 커넥터가 안보입니다. 워크플로우만 보이는데..혹시 커넥터로 수행할 수 있는 부분에 대해서, 신규 팀즈에서는 어떻게 적용해야하나요?또한, 앞으로는 신규 팀즈앱으로 언젠가는 이전되겠죠? 곧 도입 예정인데, 신규 팀즈앱으로만 테스트 및 구성 해보면 될런지요?
-
해결됨홍정모의 따라하며 배우는 C언어
double d = 0.0;으로 초기화하는 이유
위에서 다른 값들은 입력할 때 초기화를 시키지 않았는데 double d만 값을 초기화하는게 궁금합니다. 제 생각을 말씀드리면 앞의 예제들을 실행시켰을 때 값을 입력하지 않았음에도 어떠한 값이 이미 출력되더라구요. 이게 혹시 초기화를 시키지 않아서 발생했던 문제들인가요??
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Snapshot.data 타입이 Obejct가 맞나요?
안녕하세요 올해부터 플러터를 열심히 공부하고자 하는 학생입니다. 이번강의에서 2가지 질문이 있습니다.1번 질문. snapshot.data 타입List<Schedule> 리스트 변수를 생성하고, snapshot.data 를 할당하려고하는데, snapshot.data의 타입이 Object?라 할당할 수 없다고 나옵니다.print(snapshot.data.runtimeType)를 찍어보면 타입이 List<Schedule> 이라고 나오는데 왜 할당할 수 없는지 알고 싶습니다. 2번 질문. snapshot.data.where 질문snapshot.data의 타입이 object?로 인식되다보니, 아래와 같이 where 기능이 작동하지 않습니다. snapshot.data 타입을 List<Schedule>로 바꿀수 없나요?
-
미해결[2024 업데이트] UX/UI 시작하기 : Figma 입문 (Inflearn Original)
폰에서 영상이....ㅠㅠ
핸드폰에서는 영상을 볼 수 없나요???
-
미해결3D 모델링 입문을 위한 라이노(Rhino) '꿀팁' Part.1
음영설정을교수님께서 말씀하신대로 하였는데 색깔이 같지 않습니다.
강의 자료로 음영등을 설정하였는데 교수님과 동일하지 않습니다. 무었을 잘못하였는지요?그리고 서피스표시인 선도 나타나지 않네요.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
플러터에서 안드로이드 SDK API를 사용하려면?
안녕하세요 강사님강의를 들으며 많은 도움을 받고 있습니다.개인적인 프로젝트를 진행하면서네이티브(안드로이드) API를 사용할일이 생겼는데,이런 부분은 어떻게 접근해야하는지 알려주실수 있을까요?
-
미해결이득우의 꼭 배워야하는 게임 알고리즘
A* 알고리즘에 대해 질문있습니다!
이 강의를 보고, 직접 게임에 적용해보고 싶어서 다시 강의를 수강하며 공부 중인 학생입니다.맵을 만들다보면, 강의처럼 한개의 plane이 아닌 여러개의 plane 또는 오브젝트들이 바닥에 놓여질 텐데 grid를 어떻게 나눠야하는지에 대한 질문입니다!처음에는 2차원 배열로 두고, 그리드를 xOffset,yOffest에 의해 row와 col을 증가시키는 방식을 사용했습니다. 하지만, 코드를 수정하고 생각하는 과정에서 머리가 꼬여버렸습니다ㅜㅜ..두번째로는 하나의 큰 plane을 아래에 두고, 다양한 사이즈와 모양의 plane을 두는 방식을 생각하는 중입니다. 제 주변에 게임 개발자가 없어 이렇게 질문 글을 올립니다. 혹시, 실제 게임 개발시에 a* 알고리즘을 사용한다면 어떤 방식으로 그리드를 나누는지 알 수 있을까요? 알려주신다면 정말 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
FrontControllerServletV5 null 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]java.lang.NullPointerException: Cannot invoke "hello.servlet.web.frontcontroller.ModelView.getViewName()" because "mv" is null at hello.servlet.web.frontcontroller.v5.FrontControllerServletV5.service(FrontControllerServletV5.java:57) ~[classes/:na] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614) ~[jakarta.servlet-api-6.0.0.jar:6.0.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.1.jar:6.1.1] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.1.jar:6.1.1] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.1.jar:6.1.1] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]---package hello.servlet.web.frontcontroller.v5; import hello.servlet.web.frontcontroller.ModelView; import hello.servlet.web.frontcontroller.MyView; import hello.servlet.web.frontcontroller.v3.ControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberFormControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberListControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberSaveControllerV3; import hello.servlet.web.frontcontroller.v5.adapter.ControllerV3HandlerAdapter; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @WebServlet(name = "frontControllerServletV5" , urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { private final Map<String,Object> handlerMappingMap = new HashMap<>(); private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>(); public FrontControllerServletV5() { initHandlerMappingMap(); initHandlerAdapters(); } private void initHandlerMappingMap() { handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); } private void initHandlerAdapters() { handlerAdapters.add(new ControllerV3HandlerAdapter()); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object handler = getHandler(request); if (handler == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } MyHandlerAdapter adapter = getHandlerAdapter(handler); ModelView mv = adapter.handle(request, response, handler); MyView view = viewResolver(mv.getViewName()); view.render(mv.getModel(),request,response); } private Object getHandler(HttpServletRequest request) { String requestURI = request.getRequestURI(); return handlerMappingMap.get(requestURI); } private MyHandlerAdapter getHandlerAdapter(Object handler) { MyHandlerAdapter a; for (MyHandlerAdapter adapter : handlerAdapters) { if(adapter.supports(handler)){ return adapter; } } throw new IllegalArgumentException("handler adapter를 찾을 수 없습니다. handler = "+handler); } private static MyView viewResolver(String viewName) { return new MyView("/WEB-INF/views/" + viewName + ".jsp"); } } ---이런 오류가 발생하는데 어디가 문제인제 잘 모르겠습니다..왜 이런걸까요?ㅠㅠㅠ
-
해결됨[임베디드 입문용] 임베디드 개발은 실제로 이렇게 해요.
프로브 연결 터미널이 없습니다.
<온도센서를 붙여보자 1> 강의 4:10 부분 "Plugable Terminal" 모듈이 구매한 고추 건조기 세트에 없습니다. 혹시 따로 구비해야 하나요?
-
해결됨롱런하는 슈퍼 개발자가 되기 위한 필수 지식, IT 인프라 기초 총정리
포워드 프록시 서버 문의
안녕하세요 포워드 프록시 서버 문의드립니다. 보여주신 강의 자료에는 웹 서버가 캐시 서버보다 앞에 존재하는 그려져 있는데 포워드 프록시 서버에 대해 찾다 보니깐 포워드 프록시 서버는 웹 서버보다 앞에 존재하는 걸로 나와있는데 어떤게 맞는걸까요?ㅠㅠㅠㅠㅠ
-
미해결퍼블리셔 개인 포트폴리오 홈페이지 제작 완벽 가이드(PDF)
기획서 작성 방법에 대해서 질문드립니다..
안녕하세요 pdf 중 모바일 웹 섹션 부분을 읽고 있습니다..개인 포트폴리오 홈페이지에 기획서를 넣어야 한다고 하셨는데기획서 내용은 어떻게 구성해야 하는걸까요? 혹시 예시나 간단한 가이드를 알려주실 수 있을까요좋은 하루 되세요..
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
input
input 사용법 은 어느강의에서 가르쳐 주시나요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
1강 질문입니다.
섹션3까지 듣고 만든 유저를 바탕으로 게시판 API만들어보려고 spring.io로 프로젝트를 아예 새로 만들었는데요다른 건 선생님께서 주신 library-app과 유사한데, external libraries에 java11 추가하고 싶은데 추가 하는 방법을 모르겠습니다.또 new해서 새로 만들기 하면 파일, 스크래치 파일, 디렉토리만 있고 class같은 건 없어요..사실 spring.io말고 그냥 intellij에서 new project하면 처음에 설정하는 이 부분에서 generators도 다른 사람은 엄청 많고 여기서 하던데 저는 4개밖에 없는데 왜일까요..?
-
해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
런타임 중 NewObject<>()의 Replicate에 대해 조금 더 궁금합니다.
런타임중에 SpawnActor<>()와 NewObject<>()를 멀티플레이 환경에서 사용하고 싶은데,강의를 듣고 엔진 코드도 살펴보고 문서도 읽어보고 5.3 환경에서 실험도 해보고 했지만잘 모르겠어서 이렇게 질문드립니다." AActor 상속 클래스를 Replicate = true로 하고 서버에서 SpawnActor를 사용해 스폰하면 클라이언트에도 자동으로 생성이 된다. "-> 이건 실험도 해보았고 에픽 포럼 글 확인해보니 맞는거 같습니다위 실험 결과를 토대로 UActorComponent는 어떻게 동작할까? 궁금해서 실험을 해보았을 때 로그를 찍으며 실험해본 결과는 아래와 같습니다. - UActorComponent는 UActorComponent의 Replicate 속성 true false 여부에 상관없이, - 서버에서 NewObject<>()로 생성 후, (여기서 outer는 ACharacter 같은 걸로 설정해서 추후 RegisterComponent()시 문제가 없도록 하고)- RegisterComponent를 통해 등록하면 https://docs.unrealengine.com/5.3/ko/replicated-subobjects-in-unreal-engine/의 과정을 거치지 않았는데도 클라이언트에서도 자동으로 생성이 된다.라는 결과를 얻었습니다. 이게 맞나요? 제 생각엔 'NewObject<>()시 사용한 Outer가 Replicate가 true인 Actor이면, UActorComponent는 UObject를 서브 오브젝트 레플리케이트 시키기 위한 추가 로직(위 문서 링크에 나와있는) 없이도 자동으로 잘 된다' 라는 생각이 드는데이게 맞는건지 아니면 틀린건지 위에 실험도 잘못한건지 잘 모르겠습니다 ㅜㅜ혹시나 맞다면 UActorComponent를 위처럼 동적으로 수정 / 삭제 시 RemoveReplicatedSubObject도 호출하지 않아도 되나요?
-
미해결홍정모의 따라하며 배우는 C++
선택정렬 관하여 다른 코드
이 원리도 맞을까요? 부등호만 반대로 바꾸면 내림차순이 되는 것 같은데 비효율적이진 않은지 궁금합니다.