묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Watch Me Code: React x Typescript로 Slack 클론코딩하기
cannot get/ 에러 원인
1. npm run dev를 실행하면 아래와 같은 코드가 나오고 compiled successfully 라고 뜹니다. 하지만 상단에 보시면, project is running at : ________빈칸 & 컴포넌트 내부에 작성한 문자가 아닌, 로컬을 열면 cannot get / 이 뜨는데 원인이 뭘까요 ? 2. devServer:{ port: 3090, publicPath:'/dist/' } 윗 코드 작성 자체가 에러가 뜹니다..(빨간밑줄) 해결시도1) publicPath코드 삭제 해결시도2) static :{}안에 넣어주기 시도해봤는데도 cannot get/ 이 뜨네요 아래는 webpack.config,ts파일 입니다 ```js import path from 'path'; // import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; import webpack from 'webpack'; // import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; // import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; const isDevelopment = process.env.NODE_ENV !== 'production'; const config: webpack.Configuration = { name: 'sleact', mode: isDevelopment ? 'development' : 'production', devtool: !isDevelopment ? 'hidden-source-map' : 'eval', resolve: { extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'], alias: { '@hooks': path.resolve(__dirname, 'hooks'), '@components': path.resolve(__dirname, 'components'), '@layouts': path.resolve(__dirname, 'layouts'), '@pages': path.resolve(__dirname, 'pages'), '@utils': path.resolve(__dirname, 'utils'), '@typings': path.resolve(__dirname, 'typings'), }, }, entry: { app: './client', }, module: { rules: [ { test: /\.tsx?$/, loader: 'babel-loader', options: { presets: [ [ '@babel/preset-env', { targets: { browsers: ['last 2 chrome versions'] }, debug: isDevelopment, }, ], '@babel/preset-react', '@babel/preset-typescript', ], }, exclude: path.join(__dirname, 'node_modules'), }, { test: /\.css?$/, use: ['style-loader', 'css-loader'], }, ], }, plugins: [ ], output: { path: path.join(__dirname, 'dist'), filename: '[name].js', publicPath: '/dist/app.js', }, devServer: { port: 3090, static : {publicPath:'/dist/'} , }, }; // devServer: { // historyApiFallback: true, // port: 3090, // devMiddleware: { publicPath: '/dist/' }, // static: { directory: path.resolve(__dirname) }, // proxy: { // '/api/': { // target: 'http://localhost:3095', // changeOrigin: true, // ws: true, // }, // }, // }, // }; // if (isDevelopment && config.plugins) { // config.plugins.push(new webpack.HotModuleReplacementPlugin()); // config.plugins.push( // new ReactRefreshWebpackPlugin({ // overlay: { // useURLPolyfill: true, // }, // }), // ); // config.plugins.push(new BundleAnalyzerPlugin({ analyzerMode: 'server', openAnalyzer: false })); // } // if (!isDevelopment && config.plugins) { // config.plugins.push(new webpack.LoaderOptionsPlugin({ minimize: true })); // config.plugins.push(new BundleAnalyzerPlugin({ analyzerMode: 'static' })); // } export default config; ``` 아래는 package.json파일입니다 ```js { "name": "sleact-front", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "dev": "cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack serve --env development" }, "author": "dahee", "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/preset-env": "^7.16.0", "@babel/preset-react": "^7.16.0", "@babel/preset-typescript": "^7.16.0", "@types/react": "^17.0.34", "@types/react-dom": "^17.0.11", "babel-loader": "^8.2.3", "cross-env": "^7.0.3", "css-loader": "^6.5.1", "react": "^17.0.2", "react-dom": "^17.0.2", "style-loader": "^3.3.1", "typescript": "^4.4.4", "webpack": "^5.63.0" }, "devDependencies": { "@types/node": "^16.11.7", "@types/webpack": "^5.28.0", "@types/webpack-dev-server": "^4.3.1", "eslint": "^8.2.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "prettier": "^2.4.1", "ts-node": "^10.4.0", "webpack-cli": "^4.9.1", "webpack-dev-server": "^4.4.0" } } ``` 아래는 tsconfig-for-webpack-config.son파일입니다. ```js { "compilerOptions": { "module": "commonjs", "moduleResolution": "Node", "target": "es5", "esModuleInterop": true } } ```
-
미해결[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
parsing 할 때 text뿐 아니라 tag도 하는법
안녕하세요, 강사님. 좋은강의 감사드립니다. html을 배우고 xml을 배웠을때 xml의 가장큰 차이는 tag를 자유롭게 지정할 수 있다! 로 이해하고 있습니다. 그러다보니 정보가 <tag>text</tag> 이런식으로 이루어져 있을때, text뿐 아니라 tag도 종종 의미있는 값이 있는 경우가 있었습니다. 예를들면 <가격>800</가격> 처럼 800이란 값도 중요하지만 그것이 가격이라는것도 중요하더라고요 이럴때 이제 tag와 그에대응하는 text를 다 뽑고싶은데, 강의에서는 (제 짧은 기억으로는) text를 뽑는법만 배웠었습니다... 혹시 tag도 뽑고자 한다면 어떻게 접근을 해야할까요? 미리 감사드립니다.
-
미해결현존 최강 크롤링 기술: Scrapy와 Selenium 정복
[강력/최신 크롤링 기술: Scrapy 로 지마켓 크롤링하기1] 관련 질문
안녕하세요, 강사님. 우선 좋은 강의 감사드립니다. 컴퓨터쪽 전공이 아닌 저도 잘 따라가면 원하는걸 할 수 있도록 정말 강의 내용이 좋습니다. 강의를 듣다가 몇몇 질문들이 좀 생겨서 한번 문의를 드리고자 합니다. 관련 질문들은 제목에 기재한 부분에서 생긴 궁금증입니다. 1. from ecommerce.items import EcommerceItem 관련, 현재 .py에서 ecommerce.items는 상위폴더인데, 따로 표기가 없어도 상위폴더를 찾아가나요? 하위폴더와 이름이 겹치면 어떻게되나요...? 하위폴더가 우선권이 있는지 등등 궁금합니다! 2. items.py에서 클래스변수에 name = scrapy.Field()를 선언하고, spider_name.py for문에서 그 클래스의 instance를 만들고, 그 instance에서 그 클래스변수를 마치 딕셔너리처럼 찾아가는데... 사실 제가 배운 기초개념에서는 조금 와닿지가 않는데... 그냥 scrapy.Field()라는 것을 이용해 name을 만들었고 그것은 딕셔너리처럼 instance에서 찾아갈수 있도록 기능이 구현되어있다~ 수준으로만 이해하면 될까요? 3. name이라는 object에 이제 값들을 넣을때(spider_name.py에서) for문을 돌리고, 각 iteration마다 instance를 만들고 딕셔너리처럼 찾아가서 값을 넣어주고 yield를 하는데요... 파이썬기초자로서 예를들면 리스트는 append로 값을 추가해라~ 이런식으로 배웠는데... 이 경우가 익숙치 않는데 추가적인 이해를 할만한 자료가 있을까요? 아니면... 사실 그냥 쓰는 입장에서는 for문내에서 instance만들고 instance[name] = 원하는값넣고 yield instance로 통째로 모듈처럼 그냥 쓰기만하면 될까요? 4. 아직 뒷강의는 못들었지만 (혹시 뒷강의에서 나올까봐^^;;) scrapy가 동적 웹크롤링이 가능한가요?
-
미해결자바스크립트 비기너: 튼튼한 기본 만들기
빌트인 오브젝트, 소문자 대문자 오브젝트
글로벌 오브젝트와 window오브젝트의 관계에 대해 배우고 나서 의문이 생겨 질문 드립니다. 빌트인 오브젝트는 자료형에 따라 처리하는 오브젝트, 즉 소문자 object라고 이해했습니다. 근데, key : value 형태를 가진 다수의 프로퍼티의 집합이 빌트인 오브젝트이다 라는 말에 그러면 key : value 형태로 데이터를 저장하는 대문자 Object이지도 않을까라는 의문이 듭니다. 데이터의 처리와 저장의 차이점에 대한 이해가 부족한 거 같기도 하고, 빌트인 오브젝트가 둘 다의 성격을 가지고 있는 것 같아서 질문 드립니다. 감사합니다.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
onDelete와 onUpdate는 belongsTo, hasMany 둘다 달아줘야 하나요?
아니면 belongsTo에서만 다나요?
-
미해결현업 실무자에게 배우는 Kaggle 머신러닝 입문 - ML 엔지니어 실무 꿀팁
11강 7분 34초 부근 질문
4일간의 주가 평균을 my_series.iloc[4:].mean() 이라고 쓰셨는데,my_series.iloc[4:8].mean() 로 써야 하는거 아닌가요?첫번째 코드대로 시행하면 9/15부터 마지막 날까지의 주가평균이 도출되는게 아닌가해서요!
-
해결됨C# 입문부터 Xamarin Forms(자마린 폼즈) + Maui(마우이) 안드로이드, 윈도우 앱(UWP) 동시에 만들기
데이터 타입과 크기
안녕하세요. 저번에 질문을 올렸다가 그냥 지웠는데 이번에 8강인 형변환에 배울 때 의문점이 더 커져서 다시 질문을 업로드합니다.저번 질문 : 데이터 타입 크기는 데이터 타입의 값과 상관 없이 크기가 같나요?? 예를 들면 byte A = 0, byte B = 255이면,A와 B는 똑같이 1byte의 크기를 차지하나요??질문을 지운 이유 : 구글에서 1bit 는 0과 1로 표현할수 있는 최소 단위 수라고 검색해서 보게 되었어요. 그래서 제가 예상하기를 1byte 는 8bit 이므로byte A = 0과 byte B = 255는 byte A = 00000000byte B = 11111111일 것이고,그래서 byte A 와 byte B의 데이터 크기는 같으며, 반대로 uint C = 0이 있다면, byte A = 00000000uint B = 00000000000000000000000000000000일 것이니,C와 A는 값은 같지만 데이터 크기가 다를 것이다 라고 생각하면서 그냥 질문을 내려버렸거든요..질문을 다시 한 이유 : 근데 이번 8강의 형 변환 강의 끝부분에서 만약 char 의 데이터가 1byte 를 넘는다면 byte 로 명시적 형변환을 했을 때 데이터가 왜곡될 수 있다고 다시 듣게 되어서요'그걸 듣고 데이터 값에 따라 데이터 크기가 다른건가?? 내가 잘못생각한건가??' 하고 의문을 갖게 되어서 다시 질문 드렸습니다.변수 값에 따라 데이터 크기가 다른가요??만약 데이터 타입에 따라서가 아닌 값에 따라서 크기가 달라진다면 위 상황에서 A와 B의 데이터 크기는 다르고 A와 C 의 데이터 크기는 같은건가요?만약에 값과 데이터 크기가 상관이 없다면 데이터 크기가 큰것에서 작은 것으로 형 변환이 될 때 왜 무조건적으로 데이터 왜곡이 일어나지 않는건가요??------------------------------------------------------------------------------------------------------------------------- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결웹 게임을 만들며 배우는 React에 TypeScript 적용하기
리액트 타입스크립트 공식문서
안녕하세요 제로초님. 혹시 리액트에 대한 타입스크립트 문서는 보통 어디를 참고하는지 알 수 있을까요?
-
미해결설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
myip_s00 모듈에서 case문 질문이요!
chapter.13 myip_v1_0_S00_AXI 모듈내에서 case문을 이용시 axi_awaddr의 특정비트를 확인하는걸로 이해했습니다. 근데 모듈내에서 파라미터로 OPT_MEM_ADDR_BITS가 1로 설정되있는데 이 경우에 case문에서 axi_awaddr[2+1:2] 이 되어서 비트두개밖에 못보지않나요??( case를 4개만 사용할 수 있다??) 16개의 레지스터를 이용하기 위해서는 OPT_MEM_ADDR_BITS를 3으로 설정하여야 하는건지 아니면 이번lab에서는 레지스터 3번까지 사용하니 필요하지않은건지 제가 놓친부분이 있는건지 궁금하네요.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
시퀄라이저 모델 자동 생성 같은게 있을까요?
지금 이러한 작업이디비에서 create로 제약조건 테이블 힘들게 짜놓고,또 자바스크립트로 다시 테이블(모델)을 짜는건데 거기다 문법도 다르고.. 준비기간만 하루죙일 걸리겠네요..프로그램마다 다르겠지만, 보통 ERD를 짜고 자동 create문 추출 기능을 이용하여 sql문을 얻지,또 일일히 다이어그램 보고 sql코딩을 하지는 않잖아요?그런것 자동으로 모델 코드 생성해주는 모듈이나 프로그램 같은게 있을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
iterator의 end()에 대해
iterator의 end()함수가 왜 마지막 요소가 아닌 마지막 다음을 가리키는지 이유가 궁급합니다! 뭔가 그렇게 설계한 이유가 있을것 같은데 혹시 그런 이유가 있을까요? 문득 생각난건 연결리스트를 처음 설계할때 노드(Node) 설계 부분에서 헤드 노드를 만드냐 안만들고 하냐 등등의 차이로 설계방식이 달라지는것처럼 iterator도 헤드 노드를 따로 만들어놨던게 아닐까 싶은데 혹시 이유가 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
영속성 컨텍스트 유지관련 질의
15분 37초에 나온, 주문자가 모두 같은 책을 주문했을 경우엔 영속성 컨텍스트에 값이 있으니까, 쿼리가 하나만 나가도 된다, 는 말과 관련해서 영속성 컨텍스트가 언제 사라지고 다시 생성되는지 헷갈려서 질문드립니다! 요청마다 영속성 컨텍스트가 열리고 닫힌다, 로만 이해하고 있다보니 헷갈리는 듯합니다. 코드는 다음과 같습니다. @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderRepository orderRepository; @GetMapping("/api/v2/orders") public List<OrderDto> ordersV2() { List<Order> orders = orderRepository.findAllByString(new OrderSearch()); List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } @Getter static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private List<OrderItemDto> orderItems; public OrderDto(Order order) { orderId = order.getId(); name = order.getMember().getName(); orderDate = order.getOrderDate(); orderStatus = order.getStatus(); address = order.getDelivery().getAddress(); orderItems = order.getOrderItems().stream().map(orderItem -> new OrderItemDto(orderItem)).collect(Collectors.toList()); } } @Getter static class OrderItemDto { private String itemName; private int orderPrice; private int count; public OrderItemDto(OrderItem orderItem) { itemName = orderItem.getItem().getName(); orderPrice = orderItem.getOrderPrice(); count = orderItem.getCount(); } } } api/v2/orders 로 요청이 들어오면 우선, orderRepository.findAllByString 메소드가 실행되면서 영속성 컨텍스트가 열리고, 메소드가 종료되며 닫히고 orderDto 를 생성하는 과정에서 Member를 db에서 가져오며 영속성 컨텍스트가 열렸다가 닫히고 Delivery 를 가져오며 다시 열리고 닫히고 OrderItemDto를 생성하며 item 을 가져오며 영속성 컨텍스트가 닫히는 거라고 생각하고 있습니다. 정확히 어디에서 영속성 컨텍스트가 열리고 닫히는지 알 수 있을까요??
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
몇일전까지 Ctrl + F5 누르면 미로생성 잘 되었었는데요.
몇일전까지 Ctrl + F5 누르면 미로생성 잘 되었었는데요. 갑자기 오늘 해보니깐 까만색 화면에 아무것도 표시되지 않습니다. 이럴땐 어떻게 해야할까요 아마도 코드에 문제가 있는건 아닌거같습니다
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
https 적용후 nginx 502 bad gateway 오류
안녕하세요, 제로초님. 배포 후 nginx가 502 bad gateway 오류가 발생했는데, 어제는 잘 되다가 오늘 갑자기 안되서 질문드립니다... 서버를 AWS lightsail을 이용하였고, nginx/letsencrypt를 사용하여 https를 적용하였습니다. nginx 부분은 블로그에 작성하신 내용을 참고하였고, default와 .conf 파일 은 다음과 같습니다. //etc/nginx/nginx.conf user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } /etc/nginx/sites-enabled/default server { listen 443 ssl; server_name apis.hometownalba.com; ssl_certificate /etc/letsencrypt/live/apis.hometownalba.com/fullchain.pem; # managed b y Certbot ssl_certificate_key /etc/letsencrypt/live/apis.hometownalba.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; user www-data; user www-data; } server { listen 443 ssl; server_name apis.hometownalba.com; ssl_certificate /etc/letsencrypt/live/apis.hometownalba.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/apis.hometownalba.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:3065; proxy_redirect off; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; } } 그리고 error log를 찍어보았는데, 다음과 같았습니다. 2021/11/10 05:36:35 [error] 1603#1603: *5 upstream prematurely closed connection while reading response header from upstream, client: 1.238.158.106, server: apis.hometownalba.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3065/", host: "apis.hometownalba.com" 2021/11/10 05:39:37 [error] 1684#1684: *5 upstream prematurely closed connection while reading response header from upstream, client: 1.238.158.106, server: apis.hometownalba.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3065/", host: "apis.hometownalba.com" 매번 답변 감사드립니다 ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강사님, 혹시 맥이나, posix계열 boost나 linux로 강의 계획이 있으신지요?
linux계열이나 boost를 사용하여 게임 서버 강의계획이 있으신지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
springboot 로그 설정 질문 있습니다.
springboot 에서 http log 보는 설정이 뭐였죠? 어디선가 언급해줬는데 아무리 찾아봐도 어디인지 모르겠네요. 검색해도 안나오고 ...
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
공통 레이아웃 관련 문의드립니다.
layout 파일을 만들 때 <aside class="main-sidebar sidebar-dark-primary elevation-4" th:replace="${aside}"> 이런식으로 만들고 <html th:fragment="layout (aside)" xmlns:th="http://www.thymeleaf.org"> 이렇게 공통 layout에서 만들어주고 사용할 파일에서 <html th:replace="~{layout/default :: layout(~{::aside})}" xmlns:th="http://www.thymeleaf.org"> 이런식으로 상단에 선언을 해 주고 사용할 곳에서는 <aside ~~></aside> 이런식으로 하면 적용이 되는걸로 이해를 했는데 이 방법이 맞는지와 예를들어 html테그에 없는 부분 예를들어 breadcrumb도 바뀌어야 할 부분이라 그 부분도 따로 <breadcrumb~~>로 해서 등록하면 등록이 될까요?? 그런식으로 작업을 했는데 적용이 안되서 제가 어느부분을 놓치고 있는지, 아니면 방법을 잘못하고 있는지 궁금합니다. 그리고 마지막으로 section을 replace로 레이아웃파일에서 만들면 사용하는곳에서 section이라는 테그를 여러개 사용을 하고 있을 경우에는 section을 사용하는 곳 모두가 변경이 되는 형식인가요??? 만약 일괄로 변경이 된다면 템플릿용으로 사용할 수 있는 테그나 비슷한 것들이 따로 있어야 할 것 같은데.. 타임리프로 적용을 해 볼려고 테스트를 하고 있는데 적용이 잘 안되네요.ㅠㅠ
-
미해결파이썬 코딩테스트 알고리즘 100% 통과하기
코딩 환경 문의
코딩 환경 문의합니다! 프로그래머스 환경이라고 하셨는데 프로그래머스 처럼문제를 풀떄에도. from typing import List 부분도 작성해서 해야하는건가용.? 라이브러리 작성 구문 같은데 다른 코딩 테스트에 임할떄도 써줘야 하는건지 확인 부탁드립니다. 환경설정에 대한 이야기가 따로 없어서 문의 올립니다!
-
미해결차량 번호판 인식 프로젝트와 TensorFlow로 배우는 딥러닝 영상인식 올인원
강의자료 요청드립니다!
강의 잘 듣고 있습니다. 강의 마다 오디오의 퀄리티가 다른점을 제외하고는 정말 재밌게 듣고있습니다. 강의 자료가 있으면 더욱 도움이 될것 같아 요청드립니다. 이메일 : rlwnd1104@gmail.com 감사합니다.
-
해결됨스프링 핵심 원리 - 고급편
ThreadLocal 동시성 이슈 (ArrayList, HashMap, HashSet)
안녕하세요! 김영한님!!수업 너무 유익하게 잘 듣고있습니다~!! 동시성 이슈를 막기 위해 ThreadLocal을 사용하는 부분 중에서 궁금한 점이 생겨서 질문 드립니다. String, TraceId의 타입에 대해서는 ThreadLocal을 사용해서 동시성 이슈를 해결하였는데, 필드로 ArrayList, HashMap, HashSet을 사용하고 싶은 경우에는 동시성 이슈를 어떻게 해결하면 될까요 ? 구글링을 했었을 때에는 멀티쓰레드 환경에서는 HashMap 대신에 ConcurrentHashMap을 사용해라고 봤었고, ArrayList 대신에 CopyOnWirteArrayList를 사용해라고 봤었고, HashSet에 대해서는 제대로 찾지 못했습니다. 멀티쓰레드 환경에서 Thread-Safe하게 ArrayList, HashMap, HashSet을 사용하려면 어떻게 해야하나요 ?