묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
Provider를 이용한 request scope 문제 해결 방법
강의 교안 <9.빈 스코프>의 28페이지를 보면 다음과 같이 설명되어있습니다."ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다"이 때, 빈의 생성을 지연한다는 말이 실제로 getObject() 함수를 호출해야만 request scope의 MyLogger 빈이 만들어 진다는 건가요?아니면 http 요청이 들어오는 순간 이미 MyLogger 빈은 다른 로직에 의해 생성되어 존재함이 보장되고, getObject() 함수는 무조건 MyLogger 빈을 갖고 올 수 있기 때문에 이를 논리적으로 "빈의 생성을 지연한다"라고 표현하신 건가요?전자가 맞는지 후자가 맞는지 궁금합니다.*추가. 비슷한 질문이 있어서 해당 질문을 참고하여 내용을 추가하였습니다.https://www.inflearn.com/questions/702458위의 질문에서 "http요청이 들어왔을 때 request bean이 생성되는게 아니라, 생성할수있는 상태가 되는것이고, 이 상태일때 ObjectProvider.getObject()를 하게되면 request bean을 생성한후 반환하는것이다" 라는 답변이 있었습니다. 그래도 이해가 안되서, getObject() 함수가 호출되기 전에 getBean()으로 등록된 MyLogger 빈을 갖고와봤습니다. @Controller @RequiredArgsConstructor public class LogDemoController { private final ObjectProvider<MyLogger> myLoggerProvider; // 추가된 라인 private final ApplicationContext ac; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { // 추가된 라인 MyLogger testMyLogger = ac.getBean(MyLogger.class); // 추가된 라인 System.out.println(testMyLogger); String requestURL = request.getRequestURL().toString(); MyLogger myLogger = myLoggerProvider.getObject(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); LogDemoService.logic("testID"); return "OK"; } } ApplicationContext를 의존주입 받아서,getObject()가 호출되기 전에 getBean()으로 MyLogger 타입의 스프링 빈을 조회하고 출력하였는데,testMyLogger와 myLogger에 동일한 객체가 들어있었습니다.위의 답변과는 상충되는 결과인데, 제가 추가한 코드에 문제가 있는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
rejectedValue 질문
안녕하세요. 강의 너무 잘 듣고 있습니다.다름이 아니라 bindingResult.rejectValue를 공부하면서의문이 생겼는데요.이 bindingResult.rejectValue가 결국 new FieldError와 같고new FieldError("item", "itemName", null, false, ...);로 들어간다고 하셨는데 3번째 인자에 rejectedValue가 null이라면 오류가 났을 경우 사용자가 입력한 값이복구가 안되고 사라지는 것이 아닌가요?뒤에서 실행한 결과로는 값이 모두 유지되어서 의문이 들었습니다.
-
미해결스프링 핵심 원리 - 기본편
초기화라는 단어
빈 생명주기 콜백 강의를 듣고 질문 남깁니다.public NetworkClient(String url) { this.url = url; }이렇게 생성자에 url을 넘겨주어 값을 지정해주는 것이 초기화 작업이라고 생각하고 강의를 들었는데그러면 문맥상 맞지 않더라고요.가령스프링 빈은 객체 생성, 의존관계 주입이 끝나야 필요한 데이터를 사용할 수 있다.따라서 초기화 작업은 의존관계 주입이 모두 완료되고 호출되어야 한다.이런 부분에서 위 코드와 같은것이 초기화라고 생각한다면 그냥 객체 생성 단계에서 url 값이 지정되었기 때문에 그냥 사용 가능한거 아닌가요?강의에서 말하는 초기화 작업은 정확히 어떤걸 말씀하시는건가요?
-
미해결스프링 핵심 원리 - 기본편
setter 주입을 private으로 선언해도 의존 주입이 되는 이유
수정자 주입과 관련된 질문이 생겨서 글을 쓰게 되었습니다.강의에서 setter를 이용한 의존 주입을 할 때는, setter 함수를 public으로 열어놔야한다고 하셨습니다.만약에 private으로 막아놓으면 어떻게 될지 궁금해서 private으로 막아 놓고 테스트를 돌려보았는데, 여전히 올바르게 의존주입이 되는 결과가 나왔습니다.아무리 생각해봐도 스프링이 private으로 막혀있는 setter 함수를 호출할 수 없을 것 같은데, 어떻게 올바른 의존 주입이 되는 결과가 나온건지 궁금합니다.테스트에 사용한 코드는 아래와 같습니다.// OrderServiceImpl.java package hello.core.order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.Member; import hello.core.repository.MemberRepository; import hello.core.repository.MemoryMemberRepository; @Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; // ! setter 주입(setter 주입을 사용하려면 final 키워드를 사용할수 없음) @Autowired private void setMemberRepository(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Autowired private void setDiscountPolicy(DiscountPolicy discountPolicy) { this.discountPolicy = discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } // 테스트 용도 public MemberRepository getMemberRepository() { return this.memberRepository; } } // AutoAppConfigTest.java package hello.core.scan; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import hello.core.AutoAppConfig; import hello.core.member.MemberService; import hello.core.order.OrderServiceImpl; import hello.core.repository.MemoryMemberRepository; public class AutoAppConfigTest { @Test void basicScan() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class); OrderServiceImpl orderServiceImpl = ac.getBean(OrderServiceImpl.class); System.out.println(orderServiceImpl.getMemberRepository()); } } // AutoAppConfig.java package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan(basePackages = "hello.core", basePackageClasses = AutoAppConfig.class, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { }
-
미해결스프링 핵심 원리 - 기본편
@Configuration과 @ComponentScan의 충돌
안녕하세요. @ComponentScan을 공부하다가 궁금한게 생겨서 질문드립니다.@ComponentScan에 의해서 @Configuration 이 붙은 클래스를 스캔했을 때, 이 때 만들어진 스프링 빈도 팩토리 빈의 역할을 하게 되나요?예를 들어,AppConfig 라는 클래스에 @Configuration을 붙이고 내부에 @Bean을 이용해 등록할 빈들을 만들어놓는다.AutoAppConfig 라는 클래스에 @ComponentScan을 붙이고 스프링 컨테이너(ApplicationContext)에 AutoAppConfig.class 로 설정정보를 넘겨준다.위와 같이 했을 때, AutoConfig가 스프링 빈으로 등록되고 @ComponentScan에 의해 스캔이 시작되어, AutoAppConfig가 위치한 패키지부터 하위 패키지까지 스캔되어 스프링 빈이 등록 될 것입니다. (AppConfig는 패키지 내부에 속해있어 스캔된다고 가정하겠습니다.)그럼 이 경우에 exclude 필터로 @Configuration에 해당하는 클래스를 제외하지 않는다면, AppConfig도 스프링 빈으로 등록될텐데,스프링 컨테이너(ApplicationContext)에 직접적으로 AppConfig.class와 같은 설정 정보를 전달하지 않았는데, 이때도 AppConfig가 팩토리 빈이 되어, 위의 1번에서 @Bean으로 만들어놓은 빈들을 스프링 컨테이너가 등록하게 되는지 궁금합니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
flutter doctor 오류 질문
flutter doctor 시 아래와 같은 오류가 나는데...다시 해봤는데 잘 안되더라구요해결방법 질문 드립니다ㅠ
-
미해결워드프레스(WordPress) 완전정복
프로젝트 내에 있는 php파일을 a태그로 연결시킬 수 있을까요?
안녕하세요 선생님! a태그 관련해 질문이있습니다..a태그 안에 있는 이미지를 눌렀을 때, 프로젝트에 있는 특정 php파일을 열리게 하고싶었는데요.. 해당하는 함수가 따로 있을까요...? 여러가지 시도를 해보아도 안되고 서치를 해도 자료를 못찾아서 질문드립니다ㅠ 시도해보았던 코드들 중 한가지 캡쳐해서 첨부드려봅니다..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
혹시 prev 배열 연쇄 for문 python에는 그런 문법 없나요?
ret = bfs() v = [] v.append(K) while K != N: K = prev[K] v.append(K) print(ret - 1) print(*v[::-1])prev for문코드 같은 문법 파이썬에는 없나요???while문으로 만들긴했지만요
-
해결됨토비의 스프링 부트 - 이해와 원리
[스프링 컨테이너 사용] 강의 중 getBean IDE 상 에러가 뜨는데 원래 그럴까요 ?
cannot acess 에러가 발생하는데,실제, 코드를 돌리면 컴파일 및 런타임 에러 없이 동작합니다.Access 에러 길래, 접근 제어자 문제로 판단하였으나, 전부 Public 이라 딱히 문제도 없는것 같은데, 저만 그런건지 궁금합니다.registerBean 에서도 해당 클래스를 불러오기 때문에, 여기서도 에러가 뜬다면 이해하겠으나..해당 부분은 문제없고.. 밑에서만 떠서... 궁금합니다[참고로, 실행하면 컴파일 에러 없이 실행 되고... IDE 상에서는 에러로 계속 남아 있습니다. ] package com.example.helloboot; import org.apache.catalina.startup.Tomcat; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServer; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.support.GenericApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HellobootApplication { public static void main(String[] args) { // Spring Container 생성 Context 가 Container 임 // 컨테이너 생성 GenericApplicationContext applicationContext = new GenericApplicationContext(); // 오브젝트 (빈) 등록 applicationContext.registerBean(HelloController.class); // 오브젝트 생성 요청 applicationContext.refresh(); // [Step 1] Servlet 컨테이너 생성 // Factory 생성과 설정 작업등을 대신 해주는 대상 TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory(); WebServer webServer = serverFactory.getWebServer(servletContext -> { servletContext.addServlet("frontcontroller", new HttpServlet() { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 인증, 보안 , 다국어, 공통 기능 등 처리 if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) { String name = req.getParameter("name"); // binding 데이터를 처리하는 오브젝트에 데이터를 넘기는 것 HelloController helloController = applicationContext.getBean(HelloController.class); String ret = helloController.hello(name); resp.setContentType(MediaType.TEXT_PLAIN_VALUE); resp.getWriter().println(ret); } else { resp.setStatus(HttpStatus.NOT_FOUND.value()); } } }).addMapping("/*"); }); webServer.start(); } }
-
미해결
안녕하세요. 주피터 노트북 연결 에러가 자꾸 납니다.
안녕하세요. 노트북을 바꾸고 아나콘다를 정상적인 루트로 설치하고 쥬피터를 하려고 하면늘 첨부한 사진과 같은 오류가 뜨면서 정상적으로 작업이 중단되는데 해결방법이 없을까요>? ㅠ
-
해결됨스프링 핵심 원리 - 기본편
@RequiredArgsConstructor
@RequiredArgsConstructor 사용할 때, 추가 생성자를 작성하면, @RequiredArgsConstructor에 의해 자동으로 만들어진 생성자에는 @Autowired를 따로 추가해줘야하나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
11655 문제 결과값 변수 할당
안녕하세요.11655 번 문제 풀이에서 큰돌님은 입력 받은 변수 s 의 값을 덮어써서 결과를 출력하셨는데, 저는 아래처럼 새로운 변수에 담에서 출력했습니다. 이때, 공간 복잡도가 늘어나게 되는건가요?string s, res; int main() { getline(cin, s); for (char c: s) { if (c >= 97 && c <= 122) { if (c + 13 > 122) res += c + 13 - 26; else res += c + 13; } else if (c >= 65 && c <= 90) { if (c + 13 > 90) res += c + 13 - 26; else res += c + 13; } else { res += c; } } cout << res; return 0; }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 빈(Bean) 개념 관련 질문
스프링 bean 관련 공부를 하던중 구글링을 통해 정리를 해보려 했지만 헷갈려서 질문드립니다.spring container가 빈을 생성하고 생성자가 여러차례 호출되어도 실제로 생성되는 객체는 하나이며 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 가르킨다고 알고있는 상태입니다.제가 알고 있는 부분이 맞는지 그러면 test class에서 @beforeEach에 객체를 테스트 실행전 매번 새로 생성하는데 이것은 사실 결국은 하나의 최초객체를 가르킨다는 얘기인가요???
-
해결됨그림으로 쉽게 배우는 운영체제
부모 프로세스는 프로그램을 실행하지 않아도 생기는 건가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.인터넷 검색해도 정확히 써져있지 않거나, 좀 애매모호하거나 제가 이해한 것이 맞는 지 궁금해서 여쭤봅니다.1) 부모프로세스는 부팅후에 운영체제에서 바로 만드는 프로세스인가요?2) 아니면 첫 프로그램을 실행했을 때, 프로세스가 되면서 그 프로세스가 부모 프로세스가 되는 건가요?!3) 둘 다 아니면, 부모 프로세스는 fork()함수가 불러지면서 만들어지는걸까요?? 1번 경우에는 그럼, 자식프로세스보다 먼저 죽는 경우는 왜 생기는 건가요??!
-
미해결습관부터 바꿔주는 Node.js & Express 기초
swagger No operations defined in spec
/swagger.json은 잘 뜨는데/api-docs로 들어가면 'swagger No operations defined in spec!' 이라고 계속 못불러오네요..!수업때 코드 잘 따라친것 같은데, 깃헙에 코드올려주시면 감사하겠습니다..!
-
미해결Slack 클론 코딩[실시간 채팅 with React]
DMList - NavLink 태그
NavLink 사용시, onClick에서 에러가 발생합니다(property) onClick?: React.MouseEventHandler<HTMLAnchorElement> | undefinedType 'void' is not assignable to type 'MouseEventHandler<HTMLAnchorElement> | undefined'.ts(2322)index.d.ts(1448, 9): The expected type comes from property 'onClick' which is declared here on type 'IntrinsicAttributes & NavLinkProps<unknown> & RefAttributes<HTMLAnchorElement>'이런 에러가 발생하였습니다.그래서 인터넷에 검색하니까onClick={()=>resetCount(member.id)}이렇게 바꿔주면 된다고 해서 바꿔줬더니 오류가 사라졌습니다.제로초님께서는 에러가 없었는데 저만 이 오류가 나타나는 이유가 뭘까요??// import EachDM from '@components/EachDM'; // import useSocket from '@hooks/useSocket'; import { CollapseButton } from '@components/DMList/styles'; import { IDM, IUser, IUserWithOnline } from '@typings/db'; import fetcher from '@utils/fetcher'; import React, { FC, useCallback, useEffect, useState } from 'react'; import { useParams } from 'react-router'; import { NavLink } from 'react-router-dom'; import useSWR from 'swr'; interface Props { userData?: IUser; } const DMList: FC<Props> = ({ userData }) => { const { workspace } = useParams<{ workspace?: string }>(); const { data: memberData } = useSWR<IUserWithOnline[]>( userData ? `/api/workspaces/${workspace}/members` : null, fetcher, ); // const [socket] = useSocket(workspace); const [channelCollapse, setChannelCollapse] = useState(false); const [countList, setCountList] = useState<{ [key: string]: number }>({}); const [onlineList, setOnlineList] = useState<number[]>([]); const toggleChannelCollapse = useCallback(() => { setChannelCollapse((prev) => !prev); }, []); const resetCount = useCallback((id) => { setCountList((list) => { return { ...list, [id]: 0, }; }); }, []); const onMessage = (data: IDM) => { console.log('dm왔다', data); setCountList((list) => { return { ...list, [data.SenderId]: list[data.SenderId] ? list[data.SenderId] + 1 : 1, }; }); }; useEffect(() => { console.log('DMList: workspace 바꼈다', workspace); setOnlineList([]); }, [workspace]); // useEffect(() => { // socket?.on('onlineList', (data: number[]) => { // setOnlineList(data); // }); // console.log('socket on dm', socket?.hasListeners('dm'), socket); // return () => { // console.log('socket off dm', socket?.hasListeners('dm')); // socket?.off('onlineList'); // }; // }, [socket]); return ( <> <h2> <CollapseButton collapse={channelCollapse} onClick={toggleChannelCollapse}> <i className="c-icon p-channel_sidebar__section_heading_expand p-channel_sidebar__section_heading_expand--show_more_feature c-icon--caret-right c-icon--inherit c-icon--inline" data-qa="channel-section-collapse" aria-hidden="true" /> </CollapseButton> <span>Direct Messages</span> </h2> <div> {!channelCollapse && memberData?.map((member) => { const isOnline = onlineList.includes(member.id); const count = countList[member.id] || 0; return ( <NavLink key={member.id} activeClassName="selected" to={`/workspace/${workspace}/dm/${member.id}`} onClick={resetCount(member.id)} > <i className={`c-icon p-channel_sidebar__presence_icon p-channel_sidebar__presence_icon--dim_enabled c-presence ${ isOnline ? 'c-presence--active c-icon--presence-online' : 'c-icon--presence-offline' }`} aria-hidden="true" data-qa="presence_indicator" data-qa-presence-self="false" data-qa-presence-active="false" data-qa-presence-dnd="false" /> <span className={count > 0 ? 'bold' : undefined}>{member.nickname}</span> {member.id === userData?.id && <span> (나)</span>} {count > 0 && <span className="count">{count}</span>} </NavLink> ); // return <EachDM key={member.id} member={member} isOnline={isOnline} />; })} </div> </> ); }; export default DMList; +)그리고 강의 코드와 깃헙에 있는 코드가 부분적으로 다른 부분이 있는데 븥여넣을 때마다 동영상을 정지시키고 코드를 다시 작성해야해서 조금 번거로운 부분이 있는 것 같아요ㅜㅜ
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Future / async - await
안녕하세요, 선생님.기초적인 것 같은데 이해되지 않는 부분이 있어 질문드립니다.다트 공식문서상에 있는 예제입니다. void main(){ print(createOrderMessage()); } String createOrderMessage() { var order = fetchUserOrder(); return 'Your order is $order'; } Future<String> fetchUserOrder() async { return await Future.delayed(const Duration(seconds: 2), () => 'Large Latte'); } 결과:Your order is Instance of 'Future<String>'로직적으로 해석를 시도해보았고 다른 예제들도 실행하면 잘 되는데..이 예제만 궂이 main함수에 Future를 집어 넣어주야 'Large Latte'를 받을 수 있다는게 ....기본 강의를 돌려보아도 이해가 되지 않는데...좀 상세히 설명 해 주실 수 있을까요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
시작하자마자 에러가 뜹니다.
새 파일을 만들고 실행해보려고 했는데 이런 에러가 뜹니다. 혹시 어떤거 문제인지 확인해 주실 수 있나요..?
-
미해결[개념은 호옹~, 실습 빡] 스프링 부트, 입문!
28강 application.properties 설정
안녕하세요 선생님강의에서 알려주신 설정들 중spring.datasource.data=classpath:/data.sql spring.datasource.initialization-mode=always두개가 Deprecated 라고 표시되면서 대체해서 사용할 수 있는 걸 알려주는데 이렇게 사용해도 될까요?변경 후 서버를 실행해보면 돌아갑니다.변경 전 ↓변경 후 ↓
-
해결됨만들면서 배우는 프론트엔드 DO IT 코딩 (Next.js, Typescript)
빌드 오류(babel-eslint -> @babel/eslint-parser)
안녕하세요 강사님. 명쾌한 강의 덕분에 많이 배우고 있습니다. 지금까지는 모르는 부분이나 오류를 직접 찾아보고 해결해왔는데 빌드 부분은 도저히 못 찾겠어서 질문글을 작성하였습니다ㅜㅜ... 수강 도중 빌드에 계속 오류가 생겨 질문 남깁니다.(강사님의 초기설정 .eslintrc.js 파일을 사용시 오류) 초반에 강사님의 깃에서 초기설정 버전 파일을 클론해서 시작할 때부터 ts, tsx 파일 맨 첫줄들이 다 빨간줄이 떴었는데 npm run dev는 실행되길래 무시해도 되는 오류인 줄 알고 진행했습니다.ㅜㅜ .. 빌드가 안되는걸 이제서야 알았어요...babel-eslint 가 @babel/eslint-parser로 버전이 바뀌어 오류가 난다 해서 변경시도도 해보았는데 node_modules에서 못찾는다는 오류가 발생해서 지금은 다시 babel-eslint로 커밋한 시점에 돌려놓은 상태입니다.원인이 너무 궁금한데 이틀째 아침부터 저녁까지 해결방법만 찾고있는데도 해결을 못했습니다ㅜㅜ...부끄럽지만 해결 방법에 대해 질문 남깁니다..eslintrc.js 파일에서 parser : '@typescript-eslint/parser'과 parser:'babel-eslint'를 같이 쓰면 안되는 것 같지만 둘 중 하나만 지워도 또 에러가 떠서 저 상태를 유지하고 있습니다. 깃 주소는 해결되어 지우겠습니다긴 글 읽어주셔서 감사합니다.> 현재 오류 //.eslintrc.js 파일 module.exports = { parser: '@typescript-eslint/parser', // Specifies the ESLint parser extends: [ 'airbnb', 'plugin:@typescript-eslint/recommended', 'plugin:import/typescript', 'plugin:prettier/recommended', 'babel-eslint', 'prettier', ], plugins: ['babel-eslint', '@typescript-eslint', 'prettier', 'react-hooks'], parserOptions: { ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features sourceType: 'module', // Allows for the use of imports ecmaFeatures: { jsx: true, }, project: './tsconfig.json', }, parser: 'babel-eslint', env: { browser: true, jest: true, es6: true, node: true, }, globals: { cy: true, Cypress: true, }, rules: { 'arrow-parens': [2, 'always'], '@typescript-eslint/no-unused-vars': [ 1, { argsIgnorePattern: 'res|next|stage|^err|on|config|e', }, ], 'arrow-body-style': ['error', 'as-needed', { requireReturnForObjectLiteral: false }], 'no-param-reassign': [ 2, { props: false, }, ], 'no-unused-expressions': [ 1, { allowTaggedTemplates: true, }, ], '@typescript-eslint/prefer-interface': 0, '@typescript-eslint/explicit-function-return-type': 0, '@typescript-eslint/no-use-before-define': 0, '@typescript-eslint/camelcase': 0, '@typescript-eslint/no-var-requires': 0, '@typescript-eslint/no-explicit-any': 0, '@typescript-eslint/no-non-null-assertion': 0, 'no-console': 0, 'spaced-comment': 0, 'no-use-before-define': 0, 'linebreak-style': 0, 'consistent-return': 0, import: 0, 'func-names': 0, 'import/no-extraneous-dependencies': 0, 'import/prefer-default-export': 0, 'import/no-cycle': 0, 'import/extensions': 0, 'import/no-unresolved': 0, 'space-before-function-paren': 0, 'react/jsx-one-expression-per-line': 0, 'react/no-danger': 0, 'react/display-name': 1, 'react/react-in-jsx-scope': 0, 'react/jsx-uses-react': 1, 'react/forbid-prop-types': 0, 'react/no-unescaped-entities': 0, 'react/prop-types': 0, 'react/jsx-filename-extension': [ 1, { extensions: ['.js', '.jsx', '.tsx'], }, ], 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', quotes: [ 2, 'single', { avoidEscape: true, }, ], 'prettier/prettier': 'error', 'jsx-a11y/href-no-hash': 'off', 'jsx-a11y/anchor-is-valid': [ 'warn', { aspects: ['invalidHref'], }, ], }, }; // package.json 파일 { "name": "blahx2", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "@chakra-ui/icons": "^2.0.17", "@chakra-ui/react": "^1.8.8", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "axios": "^1.2.3", "chrome-aws-lambda": "^6.0.0", "firebase": "^9.15.0", "firebase-admin": "^11.4.1", "framer-motion": "^6.5.1", "moment": "^2.29.4", "next": "12.0.7", "playwright-core": "^1.30.0", "react": "17.0.2", "react-dom": "17.0.2", "react-query": "^3.39.3", "react-textarea-autosize": "^8.4.0", "styled-components": "^5.3.3" }, "devDependencies": { "@types/node": "^16.11.13", "@types/react": "^17.0.37", "@types/styled-components": "^5.1.18", "@typescript-eslint/eslint-plugin": "^5.8.0", "@typescript-eslint/parser": "^5.8.0", "babel-eslint": "^10.1.0", "babel-plugin-styled-components": "^2.0.2", "eslint": "8.4.1", "eslint-config-airbnb": "^19.0.2", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^16.1.0", "eslint-config-next": "12.0.7", "eslint-config-prettier": "^8.3.0", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.27.1", "eslint-plugin-react-hooks": "^4.3.0", "prettier": "^2.5.1", "typescript": "^4.5.4" } }