묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결입문자를 위한 게임 프로그래머 개론
앞으로 취업 준비를 어떻게 해야 할까요
안녕하세요. 취업 관련해서 준비 방향성을 어떻게 잡아야할지 고민이 돼서 질문 올려봅니다. 저는 게임 클라이언트 프로그래머가 목표인 대학생(3학점 부족)입니다. 본 전공은 경영이고 복수전공으로 it관련 학과를 공부했습니다. 원래는 이번 학기에 3학점을 채우려고 했는데 크래프톤 정글 프로그램에 합격이 돼서 합숙하면서 공부를 하고 있습니다. 여기 커리큘럼은 자료구조, 알고리즘, RB트리, 말록랩, 웹서버, 컴퓨터구조, C언어, 운영체제 등을 배우고 나머지 기간은 프로젝트를 개발하는 순서로 짜여져 있습니다. 우선은 여기서 배운 내용을 바탕으로 프로그래머 직군에 취업을 바로 할 수 있으면 할 예정인데요, 안 되면 바로 게임 포트폴리오 준비와 그래픽스와 같은 게임 개발 관련 지식을 공부하려고 합니다. 물론 바로 취업하더라도 어느정도 안정되면 나중에 다시 게임 프로그래머로 전향할 겁니다. 여기서 궁금한 점은 만약 합숙이 끝나고(8월 17일) 바로 취업이 되지 않는다면 내년 공채를 노려야 할텐데, 남은 기간동안 무엇을 어떻게 준비하는게 가장 효율적일까요? C++, 언리얼 당연히 사용할 예정이며, 다행인 점은 찾아봤던 학원에서도 자료구조나 알고리즘과 같은 핵심 cs 지식을 공부하는 시간이 꽤 있더라구요. 그래서 커리큘럼 상에서 겹치는 부분은 백준이나 프로그래머스 문제를 꾸준히 푸는 것과 cs지식 복습 정도로 대신할 수 있을 것 같습니다. 개인적으로는 6개월 정도 되는 단기 커리큘럼(있다면)을 가진 학원이나 인프런 강의들을 수강하면서 그래픽스와 같은 게임 개발 관련 지식들을 공부하려고 합니다. 조언 부탁드립니다.
-
미해결[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
이게 원말인지 모르겠습니다 ㅠㅠ....
강의대로 따라했는데, " 식에 클래스 형식이 있어야하는데, char형식이 있음"이라고 뜨는데, 무슨 말인지 모르겠습니다...
-
해결됨코딩은 처음이라 with 웹 퍼블리싱 - HTML 기초
깃허브 링크 어디에있나요?
처음에 나오는 이지웹퍼블리싱 깃허브에서 다운받으라는데 어디에 깃허브 링크가 있는지 안보입니다
-
해결됨개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제
메모리와 프로세스 질문
메모리에 프로세스가 생성 되면각각의 프로세스에 스택 영역, 힙 영역, 데이터 영역, 코드 영역이 생성 되는 건가요?만약 맞다면명령어 사이클과 인터럽트에서 말했던 인터럽트시 스택 영역에 기존 프로그램의 정보(프로그램 카운터 등)들을 저장한다 했는데,여기서 말하는 스택 영역은 각각의 프로세스의 스택 영역 과 다른 의미의 스택 영역 인가요?아니면 해당 프로세스의 스택 영역에 저장 되는건가요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
12강 데이터베이스에 있는 정보로 로그인 부분 오류가 계속 납니다
안녕하세요 선생님 12강 데이터베이스에 있는 정보로 로그인 하는 쪽 강의 질문 드립니다.app.post("/api/users/login", (req, res) => { // 요청된 이메일을 데이터베이스에서 찾는다 User.findOne({ email: req.body.email }, (err, user) => { if (!user) { return res.json({ loginSuccess: false, message: "제공된 이메일에 해당하는 유저가 없습니다", }); } // 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는 비밀번호 인지 확인 user.comparePassword(req.body.password, (err, isMatch) => { // 비밀번호가 틀릴 경우 if (!isMatch) return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다", }); // 비밀번호까지 맞다면 토큰을 생성하기 user.generateToken((err, user) => { if (err) return res.status(400).send(err); // 토큰을 저장한다. 쿠키 로컬스토리지 세션 등 // 여기서는 쿠키 사용 // x_auth라는 이름으로 토큰이 들어감 res .cookie("x_auth", user.token) .status(200) .json({ loginSuccess: true, userId: user._id }); }); }); }); });위와 같이 작성된 코드를 app.post("/api/users/login", async (req, res) => { // 요청된 이메일을 데이터베이스에서 찾는다 try { const user = await User.findOne({ email: req.body.email }); if (!user) { return res.json({ loginSuccess: false, message: "제공된 이메일에 해당하는 유저가 없습니다", }); } // 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는 비밀번호 인지 확인 const isMatch = await user.comparePassword(req.body.password); // 비밀번호가 틀릴 경우 if (!isMatch) { return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다", }); } // 비밀번호까지 맞다면 토큰을 생성하기 const token = await user.generateToken(); // 토큰을 저장한다. 쿠키 로컬스토리지 세션 등 // 여기서는 쿠키 사용 // x_auth라는 이름으로 토큰이 들어감 res .cookie("x_auth", token) .status(200) .json({ loginSuccess: true, userId: user._id }); } catch (err) { return res.status(400).json({ loginSuccess: false, error: err }); } });이렇게 변경했습니다. 그런데 postman으로 자꾸 실행해보면 비밀번호가 틀렸다는 오류를 받고 있습니다. 그리고 서버가 꺼지는 현상이 발생하고 있습니다. isMatch문이 잘못된 것 같아서 !isMatch 예외문을 주석처리하고 실행하면 서버가 바로 꺼져버리는 현상이 발생합니다. 어떻게 코드를 변경해야 할까요?그리고 console.log()로 오는 값들을 확인하고 싶은데 cossole.log()로 찍은 보고싶은 값을 어떻게 볼 수 있나요? http://localhost:5000/api/users/login 로 들어갔는데도 안보입니당..%% 이 코드를 /register로 postman을 보낼때는 정상적으로 작동하고 monogdb에도 잘 등록이 되서 다른 부분은 오류가 아닌 것 같습니다 %%%% 스키마 부분 코드도 첨부합니다 (선새인ㅁ과 똑같이 작성함) %%userSchema.methods.comparePassword = function (plainPassword, cb) { // plainPassword 는 입력한 값 데이터베이스 비밀번호는 $2b$10 등 으로 암호화 되어 있음 // 그러므로 plainPassword를 암호호 해야 함 // bcrypt를 이용해 암호화 bcrypt.compare(plainPassword, this.password, function (err, isMatch) { // this.password는 5번째줄에 userSchema에서 가져옴 if (err) return cb(err); cb(null, isMatch); }); }; userSchema.methods.generateToken = function (cb) { let user = this; // 데이터베이스의 id 를 넣고 이름을 정해준다. // 이후 secretToken을 입력하면 user._id가 나온다 let token = jwt.sign(user._id.toHexString(), "secretToken"); // user의 token에 방금 만든 token을 넣어준다. user.token = token; user.save(function (err, user) { if (err) return cb(err); cb(null, user); }); };
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
save 로 이동시 500에러가 뜹니다
An error occurred at line: [11] in the jsp file: [/WEB-INF/views/save-result.jsp]Member cannot be resolved to a type8: <ul>9: <li>id=<%=((Member)request.getAttribute("member")).getId()%></li>10: <li>username=<%=((Member)request.getAttribute("member")).getUsername()%></li>11: <li>age=<%=((Member)request.getAttribute("member")).getAge()%></li>12: </ul>13: <a href="/index.html">메인</a>14: </body> 이렇게 에러가 나타납니다...
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
exHandler의 역할에 대해 궁금한 점이 있습니다.
@Slf4j @RestController public class ApiExceptionV2Controller { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandler(IllegalArgumentException e) { log.error("[exceptionHandler] ex ", e); return new ErrorResult("BAD", e.getMessage()); } @ExceptionHandler public ResponseEntity<ErrorResult> userExHandler(UserException e) { log.error("[exceptionHandler] ex ", e); ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage()); return new ResponseEntity(errorResult, HttpStatus.BAD_REQUEST); } @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler public ErrorResult exHandler(Exception e) { log.error("[exceptionHandler] ex ", e); return new ErrorResult("EX", "내부 오류"); } @GetMapping("/api2/members/{id}") public MemberDto getMember(@PathVariable("id") String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } if (id.equals("bad")) { throw new IllegalArgumentException("잘못된 입력 값"); } if (id.equals("user-ex")) { throw new UserException("사용자 오류"); } return new MemberDto(id, "hello " + id); } @Data @AllArgsConstructor static class MemberDto { private String memberId; private String name; } }ApiExceptionV2Controller가 위와 같이 구성되어 있는데,여기서 exHandler 메서드는 fallback 기능을 하는 메서드로 이해하면 될까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
프로젝트 생성 후 기본 코드 실행 시 Null Check Operator 에러 발생
안녕하세요. 안드로이드 스튜디오에서 프로젝트 생성 후 코드수정없이 바로 실행했는데, 아래와 같은 오류가 발생합니다. 도와주세요.Oops; flutter has exited unexpectedly: "Null check operator used on a null value".A crash report has been written to C:\Users\IHC\AndroidStudioProjects\dataprogram_flutter\flutter_01.log. 아래는 flutter_01.log 파일안의 내용입니다. Flutter crash report.Please report a bug at https://github.com/flutter/flutter/issues.## commandflutter --no-color run --machine --track-widget-creation --device-id=emulator-5554 --start-paused --dart-define=flutter.inspector.structuredErrors=true lib\main.dart## exception_TypeError: Null check operator used on a null value```#0 AndroidStudioJavaGradleConflictMigration.migrate (package:flutter_tools/src/android/migrations/android_studio_java_gradle_conflict_migration.dart:107:39)#1 ProjectMigration.run (package:flutter_tools/src/base/project_migrator.dart:84:16)#2 AndroidGradleBuilder.buildGradleApp (package:flutter_tools/src/android/gradle.dart:280:15)#3 AndroidGradleBuilder.buildApk (package:flutter_tools/src/android/gradle.dart:208:11)#4 AndroidDevice.startApp (package:flutter_tools/src/android/android_device.dart:578:29)<asynchronous suspension>#5 FlutterDevice.runHot (package:flutter_tools/src/resident_runner.dart:468:33)<asynchronous suspension>#6 Future.wait.<anonymous closure> (dart:async/future.dart:525:21)<asynchronous suspension>#7 HotRunner.run (package:flutter_tools/src/run_hot.dart:421:34)<asynchronous suspension>#8 AppDomain.launch.<anonymous closure> (package:flutter_tools/src/commands/daemon.dart:649:9)<asynchronous suspension>#9 AppDomain.launch (package:flutter_tools/src/commands/daemon.dart:647:5)<asynchronous suspension>#10 RunCommand.runCommand (package:flutter_tools/src/commands/run.dart:638:15)<asynchronous suspension>#11 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1294:27)<asynchronous suspension>#12 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)<asynchronous suspension>#13 CommandRunner.runCommand (package:args/command_runner.dart:212:13)<asynchronous suspension>#14 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:296:9)<asynchronous suspension>#15 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)<asynchronous suspension>#16 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:244:5)<asynchronous suspension>#17 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:91:9)<asynchronous suspension>#18 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)<asynchronous suspension>#19 main (package:flutter_tools/executable.dart:91:3)<asynchronous suspension>```## flutter doctor```[✓] Flutter (Channel master, 3.10.0-17.0.pre.31, on Microsoft Windows [Version 10.0.19044.1288], locale ko-KR) • Flutter version 3.10.0-17.0.pre.31 on channel master at C:\flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 3ed5f51208 (81 minutes ago), 2023-04-30 05:42:24 -0400 • Engine revision e99f31f443 • Dart version 3.1.0 (build 3.1.0-56.0.dev) • DevTools version 2.23.1[✓] Windows Version (Installed version of Windows is version 10 or higher)[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.2) • Android SDK at C:\Users\IHC\AppData\Local\Android\sdk • Platform android-33, build-tools 33.0.2 • Java binary at: c:\Program Files\Android\Android Studio\jbr\bin\java • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-9586694) • All Android licenses accepted.[✓] Chrome - develop for the web • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe[✗] Visual Studio - develop for Windows ✗ Visual Studio not installed; this is necessary for Windows development. Download at https://visualstudio.microsoft.com/downloads/. Please install the "Desktop development with C++" workload, including all of its default components[✓] Android Studio (version 2022.2) • Android Studio at C:\Program Files\Android\Android Studio • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-9586694)[✓] Android Studio • Android Studio at c:\Program Files\Android\Android Studio • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • android-studio-dir = c:\Program Files\Android\Android Studio • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-9586694)[✓] Connected device (4 available) • sdk gphone x86 64 (mobile) • emulator-5554 • android-x64 • Android 13 (API 33) (emulator) • Windows (desktop) • windows • windows-x64 • Microsoft Windows [Version 10.0.19044.1288] • Chrome (web) • chrome • web-javascript • Google Chrome 112.0.5615.138 • Edge (web) • edge • web-javascript • Microsoft Edge 92.0.902.67[✓] Network resources • All expected network resources are available.! Doctor found issues in 1 category.```
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
33강 완강기준 list -> get -> list -> 페이지이동 오류 해결법
33강 완강기준이며 list에서 제목을 클릭하여 get(상세페이지) 이동후 뒤로가기를 눌러 list로 돌아와서 페이지 이동을 하면 다음페이지(list)가 아닌 get(상세페이지)가 나오는 현상이 발생했습니다.코드를 분석해보면 지금 상세보기 클릭을 누르면 pageFrm.attr("action","${cpath}/board/get");<-- 해당 코드를 통해 jsp내 적혀있는 pageFrm이란 form의 action에 ${cpath}/board/get <-- 해당 주소로 이동하기 때문에 get(상세페이지)가 나오게 됩니다.여기서 뒤로가기를 누르더라도 이미 jsp 상의 pageFrm이란 form의 action에는 ${cpath}/board/get <-- 이 주소가 적혀있으므로 새로고침을 하기전에 페이지 이동을 시도하면 list가 아닌 get(상세페이지)가 나오게 되는것입니다.해결방법은 간단합니다.ㄴ 페이지 번호를 눌렀을때 pageFrm이란 form의 액션에 list 주소가 들어가도록 추가로 js에서 처리해주면 됩니다. (아래 사진 참고하시면 됩니다.)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ResponseStatusException 에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]- 강의 자료 9.API 예외 처리 p20를 보면, @ResponseStatus를 사용할 경우, 조건에 따라 동적으로 변경하는 것이 어려워 ResponseStatusException을 사용한다고 나와 있는데,그럼, 아래처럼 작성할 수 있다는 말인가요?if(case == 1) {throw new ResponseStatusException(HttpStatus.NOT_FOUND, "error.bad", new IllegalArgumentException()); } else {throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "error.bad", new BadRequestException()); }
-
미해결처음 배우는 리액트 네이티브
안녕하세요. 스택네비게이션 문제 질문드립니다 ㅜ
얼마전에 선생님 답변 덕에 빌드는 잘 했지만 스택네비게이션 문제로 빌드 후 화면이 제대로 나오지 않아서 질문드립니다. 깃허브 주소는 https://github.com/KongGeon/jlog2 입니다.증상은 안드로이드에서 앱을 실행했을때 스플래시 화면에서 멈추는 현상입니다.App.js > Index.js > Auth.js > Signin.js 순서로 진행될때Auth.js의 스택네비게이션에서 문제가 발생하는 듯 합니다. 혹시 몰라서 옵션들도 어지간한것을은 주석처리하였는데도 스플래시에서 멈추네요 ㅜㅜApp.js의 Alert.alert("성공");은 성공적으로 나오지만 Auth.js의Alert.alert("auth");는 표시되지 않고 스플래시 화면에서 멈추는 증상이 나타납니다. Auth.js를 거치지 않고 App.js > Index.js > Signin.js index.js에서 바로 <Signin /> 를 불러오면 화면에 잘 나타납니다!
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
제이쿼리 modify 수정하실 부분이 있습니다 : )
우선 강의 차수는 33강 수정과 삭제후 페이지 번호 유지하기 파트입니다.idx, title, content, writer가 리스트로 넘어갈때는 필요하지 않기 때문에 find()로 찾고 remove() 해주는 방식인데 formData.find("#idx") <--- 현재 id 선택자로 찾고있습니다. 강의 / github 둘다 확인해보시면 name만 지정하였기 때문에 formData.find("#idx")로는 찾을수가 없습니다.수정해주시겠지만 해당 글을 보는 다른 분들을 위해서 방안을 2가지 정도 적어보자면1. formData.find("#idx") <-- 여기서 id로 idx를 찾아주고 있으니 각 id,title,content,writer가 기입되어 있는 태그에 id를 작성해주시면 될듯합니다. 예시 -> <td><input type="text" class="form-control" id ="idx" name ="idx" value="${vo.idx}" readonly ="readonly"/></td>2. formData.find("#idx") <-- 현재는 id를 읽고 있는데 name을 읽을수 있게 변경하면 됩니다.예시 -> formData.find("input[name='idx']").remove();
-
해결됨[2026 신규] 데이터분석 준전문가(ADsP) 자격증
3-15 연관분석 개념 내용 빠졌어요.
연관분석 문제풀이만 있고 개념설명 강의가 없습니다!
-
미해결[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
포인터 문자열 할당시 +1해주는 이유
안녕하십니까section2의 포인터와 배열/문자열 강의의 예시 중 ps = new char[strlen(animal)+1]; 부분에서 +1을 해주는 이유가 무엇인가요?null값과 관련되었다고 예상되는데 만약 그렇다면null값이 필요한 string과 달리 char형은 '\n'과 같은 null값이 없어도 된다고 알고 있습니다.1byte더 큰 크기 할당이 왜 필요한가요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TestLock을 Template으로 만들경우
TestLock을 Template class 로 선언할경우typename을 type으로 명명한 상황에서TestRead에서의 _queue가 Empty일경우 반환값을 지정할 방법이 있을까요??
-
해결됨업무가 100배 빨라지는 엑셀 데이터 활용과 분석 노하우
병합해제 시 테두리 자동생성, 셀서식에서 0과 #차이
안녕하세요, 강사님 저는 office365 사용중입니다. 질문 드립니다. 병합해제 시 테두리 생성 ('빈셀만 선택하여 데이터 동시입력' 강의 중 05:07경)강사님은 병합해제 하면 표에 테두리가 생기던데, 저는 병합해제하면 테두리가 생기지 않아요. 엑셀버전마다 다른건가요?셀서식에서 0과 #의 차이('데이터를 분리하고 잘못된 형식 변환' 강의 중 12:12경)강사님은 000-00-00000을 사용하셨는데, ###-##-#####도 결과는 같더라구요.0과 #은 어떤 차이인가요?답변 부탁드립니다. 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HandlerExceptionResolver 에 대해 궁금한 점이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]- 강의를 보면, 스프링이 제공하는 ExceptionResolver에 대해 나오는데, 그러면, 그 전에 HandlerExceptionResolver는 스프링이 제공하는게 아니라 서블릿에서 제공하는 건가요?
-
미해결엑셀 시작하기 : EXCEL 입문 (Inflearn Original)
수식 질문 드립니다.
선생님 안녕하세요. 다름이 아니라 수식을 잘 못해서 헤메다 선생님 생각이 궁금해서 여쭙게 되었습니다.1. 학생의 성적을 입력하면 대학 별 반영식에 따라 자동으로 점수가 산출되는 수식2. 산출된 점수로 상향, 안전, 하향 지원 여부 표기되게 하는 수식어떤 방법을 사용해야 좋을까요..?
-
해결됨외워서 끝내는 SSL과 최소한의 암호기술
공캐키 신뢰를 위한 검증체계 12:53에 적힌 글 질문있습니다
SSL 인증서를 검증하는 방법은 ~~~ CA의 인증서에서 포함된 Public key를 이용해 SSL 인증서 Hash 결과를 복호화 하면 된다가 아니라암호화된 Hash를 복호화 하면 된다가 맞지 않나요??아니면 Hash 결과라는 말이 암호화된 Hash를 말씀하시는건가요?
-
해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
북마크 탭에서 북마크 취소 시 문제
안녕하세요. 북마크 진행하다가 북마크 탭에서 북마크를 삭제하는 부분에서 문제가 생겨 질문 올립니다.아래 상태에서북마크를 취소하기위해 클릭하면이렇게 제가 누른 부분은 사라지지만(이 부분은 제가 클릭했을 때 bookmarkIdList에 KeyList가 없다면 사라지게 해놓은 겁니다) 또 중복으로 아이템이 생깁니다. 계속 시도해봤는데 어디서 고쳐야할지 잘 모르겠습니다.아래는 BookmarkRVAdapter.kt의 코드입니다. 편하실 때 답변해주시면 감사하겠습니다!package com.bokchi.mysolelife.contentsList import android.content.Context import android.content.Intent import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.bokchi.mysolelife.R import com.bokchi.mysolelife.utils.FBAuth import com.bokchi.mysolelife.utils.FBRef import com.bumptech.glide.Glide class BookmarkRVAdapter(val context : Context, val items : ArrayList<ContentModel>, val keyList : ArrayList<String>, val bookmarkIdList : MutableList<String> ) : RecyclerView.Adapter<BookmarkRVAdapter.Viewholder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BookmarkRVAdapter.Viewholder { val v = LayoutInflater.from(parent.context).inflate(R.layout.content_rv_item, parent, false) Log.d("RVAdapterB", "key List : " + keyList.toString()) Log.d("RVAdapterB","Bookmark List : " + bookmarkIdList.toString()) return Viewholder(v) } override fun onBindViewHolder(holder: BookmarkRVAdapter.Viewholder, position: Int) { holder.bindItems(items[position], keyList[position]) } override fun getItemCount(): Int { return items.size } inner class Viewholder(itemView : View) : RecyclerView.ViewHolder(itemView) { fun bindItems(item : ContentModel, key : String) { itemView.setOnClickListener { val intent = Intent(context, ContentShowActivity::class.java) intent.putExtra("url", item.webUrl) itemView.context.startActivity(intent) } val ContentTitle = itemView.findViewById<TextView>(R.id.TextArea) val imageViewArea = itemView.findViewById<ImageView>(R.id.imageArea) val bookmarkArea = itemView.findViewById<ImageView>(R.id.BookmarkArea) if(bookmarkIdList.contains(key)) { // bookmarkIdList가 KeyList에 있는 정보를 가지고 있다면 bookmarkArea.setImageResource(R.drawable.bookmark_color) } else { bookmarkArea.setImageResource(R.drawable.bookmark_white) } ContentTitle.text = item.title Glide.with(context) .load(item.imageUrl) .into(imageViewArea) bookmarkArea.setOnClickListener { // 북마크를 누르면 실행되는 내용 // 북마크를 클릭했을 때, 북마크가 있는 경우 -> 북마크 삭제 if(bookmarkIdList.contains(key)) { ContentTitle.visibility = View.GONE imageViewArea.visibility = View.GONE bookmarkArea.visibility = View.GONE FBRef.bookmarkRef .child(FBAuth.getUid()) .child(key) .removeValue() } } if(bookmarkIdList.isEmpty()) { ContentTitle.visibility = View.GONE imageViewArea.visibility = View.GONE bookmarkArea.visibility = View.GONE } Log.e("BOOKMARK", bookmarkIdList.toString()) } } }