묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 OAuth2
검증 아키텍처 이해 - BearerTokenAuthenticationFilter 강의 편 질문있습니다.
강의 : 검증 아키텍처 이해 - BearerTokenAuthenticationFilter 안녕하세요 강사님, 강의 학습중 질문이 있습니다. 다음은, 시큐리티 설정 파일 일부 코드이며여기서 JwtAuthorizationRsaPublicKeyFilter 를 추가로 Bean 등록하였는데요. 일단 Bearer 에 관련된건 BearerTokenAuthenticationFilter가 수행하고doFilterInternal 메서드에서 시큐리티 컨텍스트에 저장 하는 코드를 확인했습니다. 여기서 수업시간에 생성한 JwtAuthorizationRsaPublicKeyFilter 필터입니다첫번째 질문강의 예제 한에서는 시큐리티 컨텍스트에 저장하는초점에 있어서는,JwtAuthorizationRsaPublicKeyFilter 필터가 없어도 문제 없는것 같은데 제 생각이 맞나요? 두번째 질문두 필터의 순서는 어떻게 지정되는건가요? 세번째 질문또한 JwtAuthorizationRsaPublicKeyFilter 필터에 추가적인 로직을 부여한다면,1. 직접 커스텀 필터를 특정 필터 전/후에 등록2.리프레쉬 토큰 로직3.DB 커넥션이 필요한 작업4. 토큰 유효시간 검증등과 같은 작업할때 일까요?아니면 또다른 상황이 있을까요?
-
해결됨디지털포렌식전문가 2급 필기 핵심 요약집[전자책]
안녕하세요 자격증 관련하여 질문이 있습니다.
안녕하세요 이번에 디지털포렌식전문가2급 준비하는 학생입니다.다름이 아니라 자격증과 관련하여 궁금한 것이 있어 여쭈어봅니다.일단 필기, 실기 둘 다 합격해야 자격증 발급이 되는 것으로 인지를 하고 있는데 만약 필기는 합격하고 실기는 합격하지 못한 경우 필기가 합격됐다는 것이 인정되는 기간이 어느정도인지 궁금합니다.(필기를 합격해야 실기를 볼 수 있다고 인지를 하기 때문에 이러한 질문을 드립니다)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 cmd 에서의 실행(질문 수정)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 이번에 기본적으로 필요한 자바와 db를 독학한 후 스프링을 시작하였습니다.이번 빌드를 실행할 때, 저는 자바 17버전과 스프링부트 3.0 이상 버전을 다운했기에 교안에 나와있는 '자주하는 질문'에 나와있는 [Querydsl 부트 3.x 설정] 의 gradle 버전에 맞게 코드를 옮겨붙인 후 실행하였습니다.gradle의 코드를 처음 그대로의 상태(gradle 수정 전)에서 실행할 때는 intellij 와 윈도우 모두 잘 실행되었으나,gradle 부분을 Querydsl 부트 3.x 설정로서 실행하니 intellij에선 이상이 없었지만, 윈도우 cmd에서 실행할 시 /hello 는 연결이 안되었습니다. gradle 수정으로 인한 에노테이션 연결이 달라져 라이브러리를 가져오지 못한 건가 라는 생각은 들지만, 이게 확실치 않고 어떻게 수정을 해야할지 찾아봐도 해결책을 찾지 못해 질문드립니다.(빌드를 하는데는 오류가 발생하지 않았습니다.) 1.수정 전의 gradle수정 후의 gradle - ( '자주하는 질문'에 나와있는 [Querydsl 부트 3.x 설정] )plugins { id 'java' id 'org.springframework.boot' version '3.1.1' id 'io.spring.dependency-management' version '1.1.0' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } repositories { mavenCentral() } jar { enabled = false }dependencies {implementation 'org.springframework.boot:spring-boot-starter-data-jpa'implementation 'org.springframework.boot:spring-boot-starter-web'implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'compileOnly 'org.projectlombok:lombok'runtimeOnly 'com.h2database:h2'annotationProcessor 'org.projectlombok:lombok'testImplementation 'org.springframework.boot:spring-boot-starter-test'//Querydsl 추가implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api"}tasks.named('test') {useJUnitPlatform()}clean {delete file('src/main/generated')}cmd에서의 실행순서1. 저장해놓은 hello-spring 디렉토리로 이동2. gradlew.bat build -x check 으로 빌드( -x check 없이 빌드 시 에러가 발생하여 구글링을 통해 찾아낸 방법입니다.)3. java -jar (빌드한 jar 파일)결과수정 전 gradle 에서는 이상이 없으나.수정 후 gradle로 실행 시, intellij에서는 이상없이 잘 작동하지만, cmd로 실행 시 localhost:8080/hello 에서 whitelable error page가 발생저의 오류원인 추측1.애노테이션이 제대로 되지 않아 라이브러리를 불러오지 못했다.2. 지정된 파일 경로가 잘못되어 에러가 발생했다.
-
해결됨Next.js 시작하기(feat. 지도 서비스 개발)
실행안됨
위와 같이 실행이 안되고 저 상태로 계속 멈춰있습니다. 종료하고 다시해도 안되고, 삭제했다 다시 설치해도 안되고, 컴퓨터를 껐다 켜도, NPM을 업그레이드 시켜도 계속 저 창에서 멈춰있는 것만 반복하는데 뭐가 문제일까요?
-
해결됨Next.js 시작하기(feat. 지도 서비스 개발)
getStaticPaths 질문
1. fallback:true인 경우 npm run build 할때 정적 페이지를 생성하는게 아니라외부사용자가 접근한 시점에 생성을해서 보여준다는 것인가요?맞다면 npm build 시점에는 생성을 하나도 안한다는 건가요?2. fallback: false인 경우 npm run build 시에 getStaticPaths 에서 return한 path에 대한 페이지만 생성하는게 맞나요?3. getStaticProps 안에서 fallback에 대한 처리는 fallback:true인 경우에만 처리하는거죠?(return { notFound: true } 같은것)4. getStaticPaths는 path에 따른 페이지를 생성시켜주는 함수이니 동적 라우팅에만 사용하는 함수인가요?5. 데이터가 자주 바뀌는 페이지도 이러한 방식을 적용가능한것 같은데 초기 페이지에 대해서SSR과 SSG 중 하나의 선택지로 골라서 적용을 해야할것 같네요. 어떤것을 선택해야 하는지는직접 성능을 측정해가면서 비교하는게 정확한가요? 아니면 강좌에서 말씀하신것 처럼 웬만하면 SSR를 지양하고SSG를 적용하는쪽으로 가는게 좋은건가요? CSR, SSR, SSG 적용을 하는 판단기준이 잘 안서네요.
-
미해결Practical Testing: 실용적인 테스트 가이드
Controller 테스트할 때, Service 에 대한 로직
안녕하세요! 테스트에 대해 의아했던 부분이 많이 풀리는 강의입니다. 정말 감사드려요. 강의를 잘 듣고 있다가 궁금한게 생겨서요!controller @mockBean Service service @test void postData() { // when when(service.message()).thenRetrun() }간단하게 코드를 적어봣는데요!service에 대해 MockBean으로 주입만 해줬을 뿐, Service에 대한 로직이 없어서요!제 생각에는 Service가 return 하는 부분은 이미 서비스 계층에서 테스트가 끝났고 Controller 에 테스트를 해야하는 주점은1 ) Request 에 오는 데이터들의 검증뿐이라고 생각하는데 맞나요? Get 같은 경우에도 Service에 오는 건 그냥 빈 배열처리하셨더라구요! 감사합니다!
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
처음 테스트시에 에러가 나오는데 모르겠네요
처음 테스트 하는데 이렇게 나옵니다.왜 이럴까요? ㅠㅠ
-
미해결[2025년 출제기준] 웹디자인기능사 실기시험 완벽 가이드
footer에 사진처럼 일자로 되어있는데 똑같이 따라했는데 뭐가문제일까요 ,,
푸터부분에 일자로 되어서 강의처럼 안되는데 뭐가문제일까요 ,,선생님이 하신대로따라했는데 계속 저부분이 안되서 문의드립니다 ...ㅠㅠㅠㅠ
-
미해결스프링 핵심 원리 - 고급편
args 표현식을 이용한 매개변수 전달 개념 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 포인트컷 표현식을 이용하여 매개변수를 전달하는 것을 공부했습니다. 이 개념과 본래 포인트컷의 개념이 헷갈려서 문의드립니다. @Around("allMember() && args(arg, ..)") public Object logArgs2(ProceedingJoinPoint joinPoint, Object arg) throws Throwable { log.info("[logArgs2]{}, arg={}", joinPoint.getSignature(), arg); return joinPoint.proceed(); } 포인트컷은 조인 포인트를 필터링하기 위한 개념으로 공부했습니다. 위 코드에서 args(args, ..) 부분의 args가 매개변수를 나타내는 것은 이해가 됩니다. 하지만 ArgsTest 코드에서 학습했을 때는 args() 표현식 안에 String, Object, java.io.Serializable 등등과 같은 타입을 적어줘서, 매개변수의 타입을 필터링했었거든요. 그러면 args는 어떤 타입을 필터링하는 포인트컷인가요? 무엇이든 상관없는건가요?
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
쿠팡 사례처럼 다른 사이트에서 User-Agent로 크롤링이 불가능한 경우
감사합니다.
-
미해결홍정모의 따라하며 배우는 C언어
강의 예제 flag의 사용이유
강의 초반부분 0:20 부분을 보고 코드를 짜보았습니다.#include <stdio.h> int main() { char ch; int characters = 0, words = 1, lines = 1; printf("Enter text : "); while ((ch = getchar()) != '.') { if (ch == ' ') words++; else if (ch == '\n') lines++; else characters++; } printf("Character = %d, Words = %d, Lines = %d", characters, words, lines); return 0; }이 후 강의를 끝까지 다 봤는데 교수님의 코드와 저의 코드는 상당히 달랐습니다. 교수님은 flag라는 _Bool자료형을 사용했습니다.코드를 한줄 한줄 읽어가면서 flag가 어떤식으로 작동하는지는 쪼오끔 알았는데 flag를 사용하는 이유를 모르겠습니다.강의를 보면 프로그래머들이 자주 사용하는 형식이라고 하는데 flag의 장점이 뭔가요? 항상 감사합니다!!!
-
해결됨[유니티 3D] 실전! 생존게임 만들기 - Advanced
34:49 내용 생략 부분
34:49~ 36:40 부분은 흐름이 이상한 부분입니다. (뒤에있는 내용이 그대로 들어가있는 것으로 보아 편집미스로 보입니다.) 처음보시는분들은 34:49 까지 보신후 36:41로 건너 뛰십시오. 유튜브 발췌.
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
IPS가 무엇인가요?
안녕하세요 선생님. "WAS와 RESTful API 그리고 JVM" 강의 수강중에 질문드립니다.IPS가 Intrusion Prevention System 의 약자가 맞나요? 그리고 IPS가 원격지 사용자 입력을 검증하는 역할을 하는건가요?감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 빌드 Task :test FAILED
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]gradlew.bat 는 BUILD SUCCESSFUL 이 떴는데gradlew build 는 아래와 같은 오류가 발생합니다.자바 버전은 20이고, 스프링 버전은 3 입니다. > Task :test FAILEDError: Could not find or load main class worker.org.gradle.process.internal.worker.GradleWorkerMainCaused by: java.lang.ClassNotFoundException: worker.org.gradle.process.internal.worker.GradleWorkerMain
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
React 실전프로젝트 질문
왜 강의와 다르게 이렇게 표시되는게 맞는지 굼금해서 올려봅니다.아니라면 왜 이런지 알려주시면 감사하겠습니다.밑에는 App.css입니다.@import url('https://fonts.googleapis.com/css2?family=Nanum+Pen+Script&family=Yeon+Sung&display=swap'); body { background-color: #f6f6f6; display: flex; justify-content: center; align-items: center; font-family: 'Nanum Pen Script'; min-height: 100vh; margin: 0px; } @media (min-width: 650px) { .App { width: 640px; } } @media (max-width: 650px) { .APP { width: 90vw; } } #root { background-color: white; box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px; } .App { min-width: 100vh; padding-left: 20px; padding-left: 20px; } /* my button */ .MyButton { cursor: pointer; border: none; border-radius: 5px; padding-top: 10px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; font-size: 18px; white-space: nowrap; font-family: 'Nanum Pen Script'; } .MyButton_default { background-color: #ececec; color: black; } .MyButton_positive { background-color: #64c964; color: white; } .MyButton_negative { background-color: #fd565f; color: white; } /* header */ header { padding-top: 20px; padding-bottom: 20px; display: flex; align-items: center; border-bottom: 1px solid #e2e2e2; } header > div { display: flex; } header .head_text { width: 50%; font-size: 25px; justify-content: center; } header .head_btn_left { width: 25%; justify-content: start; } header .head_btn_right { width: 25%; border-left: 25px; justify-content: end; } header button { font-family: 'Nanum Pen Script'; } /* DiaryList */ .DiaryList .menu_wrapper { margin-top: 20px; margin-bottom: 30px; display: flex; justify-content: space-between; } .DiaryList .menu_wrapper .right_col { flex-grow: 1; } .DiaryList .menu_wrapper .right_col button { width: 100%; } .DiaryList .ControlMenu { margin-right: 10px; border: none; border-radius: 5px; background-color: #ececec; padding-top: 10px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; cursor: pointer; font-family: 'Nanum Pen Script'; font-size: 18px; } /* DiaryItem */ .DiaryItem { padding-top: 15px; padding-bottom: 15px; border-bottom: 1px solid #e2e2e2; display: flex; justify-content: space-between; } .DiaryItem .emotion_img_wrapper { cursor: pointer; min-width: 120px; height: 80px; border-radius: 5px; display: flex; justify-content: center; } .DiaryItem .emotion_img_wrapper_1 { background-color: #64c964; } .DiaryItem .emotion_img_wrapper_2 { background-color: #9dd772; } .DiaryItem .emotion_img_wrapper_3 { background-color: #fdce17; } .DiaryItem .emotion_img_wrapper_4 { background-color: #fd8446; } .DiaryItem .emotion_img_wrapper_5 { background-color: #fd565f; } .DiaryItem .emotion_img_wrapper img { width: 50%; } .DiaryItem .info_wrapper { flex-grow: 1; margin-left: 20px; cursor: pointer; } .DiaryItem .diary_date { font-weight: bold; font-size: 25px; margin-bottom: 5px; } .DiaryItem .diary_centent_preview { font-size: 18px; } .DiaryItem .btn_wrapper { min-width: 70px; } /* DirayEditor */ .DirayEditor textarea { font-family: 'Nanum Pen Script'; font-size: 20px; box-sizing: border-box; width: 100%; min-height: 200px; resize: vertical; border: none; border-radius: 5px; background-color: #ececec; padding: 20px; } .DirayEditor .control_box { display: flex; justify-content: space-between; align-items: center; } .DirayEditor section { margin-bottom: 40px; } .DirayEditor h4 { font-size: 22px; font-weight: bold; } .DirayEditor .input_date { border: none; border-radius: 5px; background-color: #ececec; padding-top: 10px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; cursor: pointer; font-family: 'Nanum Pen Script'; font-size: 20px; } .DirayEditor .emotion_list_wrapper { display: grid; grid-template-columns: repeat(5, auto); gap: 2%; } /* EmotionItem */ .EmotionItem { cursor: pointer; border-radius: 5px; padding-top: 20px; padding-bottom: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center; } .EmotionItem img { width: 50%; margin-bottom: 10px; } .EmotionItem span { font-size: 18px; } .EmotionItem_off { background-color: #ececec; } .EmotionItem_on_1 { background-color: #64c964; color: white; } .EmotionItem_on_2 { background-color: #9dd772; color: white; } .EmotionItem_on_3 { background-color: #fdce17; color: white; } .EmotionItem_on_4 { background-color: #fd8446; color: white; } .EmotionItem_on_5 { background-color: #fd565f; color: white; }
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
UPDATE_BOARD 400error
useForm 이용해서 하고있는데 update_board를 할때 계속 try에서 catch(error)로 넘어가네요 ㅠpresenter.jsimport * as S from "./BoardWriter.styles"; export default function BoardWriteUI(props) { return ( <S.Wrapper onSubmit={props.isEdit? props.handleSubmit(props.onClickUpdate, props.onInValid) : props.handleSubmit(props.onValid, props.onInValid)}> <S.Title>{props.isEdit? "게시글 수정": "게시글 등록"}</S.Title> <S.WriterWrapper> <S.InputWrapper> <S.Label>작성자</S.Label> <S.Writer {...props.register("writer", { validate : (value) => value ? true:"작성자를 작성해주세요."} )} onChange={e => props.onChangeWriter(e)} type="text" placeholder="이름을 적어주세요."/> <S.Error>{props.errors.writer?.message}</S.Error> </S.InputWrapper> <S.InputWrapper> <S.Label>비밀번호</S.Label> <S.Password {...props.register("password", { validate : (value) => value? true: "비밀번호를 작성해주세요."} )} onChange={e => props.onChangePassword(e)} type="password" placeholder="비밀번호를 작성해주세요." /> <S.Error>{props.errors.password?.message}</S.Error> </S.InputWrapper> </S.WriterWrapper> <S.InputWrapper> <S.Label>제목</S.Label> <S.Subject {...props.register("title", { validate : (value) => value? true: "제목을 작성해주세요."} )} onChange = {e => props.onChangeTitle(e)} type="text" placeholder="제목을 작성해주세요." /> <S.Error>{props.errors.title?.message}</S.Error> </S.InputWrapper> <S.InputWrapper> <S.Label>내용</S.Label> <S.Contents {...props.register("contents", { validate : (value) => value? true: "내용을 작성해주세요."} )} onChange={e => props.onChangeContents(e)} placeholder="내용을 작성해주세요." /> <S.Error>{props.errors.contents?.message}</S.Error> </S.InputWrapper> <S.InputWrapper> <S.Label>주소</S.Label> <S.ZipcodeWrapper> <S.Zipcode {...props.register("boardAddress")} placeholder="07250" /> <S.SearchButton>우편번호 검색</S.SearchButton> </S.ZipcodeWrapper> <S.Address /> <S.Address /> </S.InputWrapper> <S.InputWrapper> <S.Label>유튜브</S.Label> <S.Youtube {...props.register("youtubeUrl")} placeholder="링크를 복사해주세요." /> </S.InputWrapper> <S.ImageWrapper> <S.Label>사진첨부</S.Label> <S.UploadButton>+</S.UploadButton> <S.UploadButton>+</S.UploadButton> <S.UploadButton>+</S.UploadButton> </S.ImageWrapper> <S.OptionWrapper> <S.Label>메인설정</S.Label> <S.RadioButton type="radio" id="youtube" name="radio-button" /> <S.RadioLabel htmlFor="youtube">유튜브</S.RadioLabel> <S.RadioButton type="radio" id="image" name="radio-button" /> <S.RadioLabel htmlFor="image">사진</S.RadioLabel> </S.OptionWrapper> <S.ButtonWrapper> <S.SubmitButton isActive={props.isActive} type="submit">{props.isEdit? "수정하기": "등록하기"}</S.SubmitButton> </S.ButtonWrapper> </S.Wrapper> ); } quires.jsimport { gql } from '@apollo/client' export const CREATE_BOARD = gql` mutation createBoard($createBoardInput: CreateBoardInput!) { createBoard(createBoardInput : $createBoardInput){ _id } } ` export const UPDATE_BOARD = gql` mutation updateBoard($updateBoardInput: updateBoardInput!, $password: String, $boardId: ID!) { updateBoard(updateBoardInput: $updateBoardInput, password: $password, boardId: $boardId) { _id } } `container.jsimport { useState } from 'react' import { useForm } from 'react-hook-form'; import { useRouter } from 'next/router'; import { useMutation } from '@apollo/client' import BoardWriteUI from './BoardWriter.presenter'; import { CREATE_BOARD, UPDATE_BOARD } from './BoardWriter.queries'; export default function BoardsWriteContainer(props) { const router = useRouter() const [isActive, setIsActive] = useState(true) const [createBoard] = useMutation(CREATE_BOARD) const [updateBoard] = useMutation(UPDATE_BOARD) const { register, watch, handleSubmit, formState: { errors } } = useForm(); const onChangeWriter = (e) => { e.target.value && watch("password") && watch("title") && watch("contents") ? setIsActive(false) : setIsActive(true) } const onChangePassword = (e) => { e.target.value && watch("writer") && watch("title") && watch("contents") ? setIsActive(false) : setIsActive(true) } const onChangeTitle = (e) => { e.target.value && watch("password") && watch("writer") && watch("contents") ? setIsActive(false) : setIsActive(true) } const onChangeContents = (e) => { e.target.value && watch("password") && watch("title") && watch("writer") ? setIsActive(false) : setIsActive(true) } const onValid = async (data) => { try { const result = await createBoard({ variables: { createBoardInput: { writer: data.writer, title: data.title, password: data.password, contents: data.contents, } } }) console.log(result.data.createBoard._id) alert("게시물이 정상적으로 등록되었습니다.") router.push(`/boards/${result.data.createBoard._id}`) } catch(error) { alert(error.message) } } const onInValid = (error) => { console.log("에러입니다", error) } const onClickUpdate = async (data) => { try { const result = await updateBoard({ variables: { updateBoardInput : { title: data.title, contents: data.contents }, password : data.password, boardId : router.query.boardid, } }) console.log(result) // router.push(`/boards/${router.query.boadid}`) } catch(error) { console.log(error) } } return <BoardWriteUI onValid = {onValid} oninValid = {onInValid} register = {register} handleSubmit = {handleSubmit} errors = {errors} onChangeContents = {onChangeContents} onChangeTitle = {onChangeTitle} onChangePassword = {onChangePassword} onChangeWriter = {onChangeWriter} onClickUpdate = {onClickUpdate} isActive={isActive} isEdit={props.isEdit} /> }
-
미해결더 자바, 코드를 조작하는 다양한 방법
gradle 사용하시는 분 도움
일단 새로운 프로젝트 만들고 premain 추가해주는 것 까진 강의를 그대로 따라하시면 됩니다. manifest plugin 부터 조금 차이가 있어서 거기부터 설명하면, build gradle 에 다음과 같이 추가한다.tasks.named('jar') { manifest { attributes( 'Implementation-Title': project.name, 'Implementation-Version': project.version, 'Premain-Class' : "com.java.magicianAgent.MagicianAgent", 'Can-Redefine-Classes' : true, 'Can-Retransform-Classes' : true) } }터미널에서 다음 명령어를 통해 build 한다./gradlew clean buildbuild.libs file 안에 있는 jar file 을 확인한다. (옵션)강의에서와 마찬가지로 zip file 로 변경하면 확인가능합니다. 저같은 경우 SNAPSHOT.jar 과 SNAPSHOT-plain.jar 이렇게 2개가 생겼는데 SNAPSHOT.jar 은 제가 spring boot 로 실행서 그런지 관련 설정들이 보이고 SNAPSHOT-plain.jar 이 맞는거 같더라구요. jar file 의 절대 경로를 복사해 VM option 에 추가한다. 여기서부터는 다시 강의와 같습니다. VM option 이 안보이시면 오른쪽에 Modify options 클릭하면 add vm options 라고 보이실 겁니다. 이상한거나 궁금한거 있으시면 말씀해주세요. gradle 을 쓰시는 모든 분들도 마술을 성공시킵시다 하하
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 리뷰 부탁드리겠습니다!!
(사진)
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
강의 9.3 에서 passport.authenticate('local')이 호출되면 그 이후 passport.use( new LocalStrategy() ) 로 어떻게 흐름이 넘어가는지 모르겠습니다.
강의 9.3 에서 route/auth.js 파일에서 passport.authenticate('local')부분이 호출되는 것 까지는 이해가 됩니다. 근데 왜 authenticate에서 passport/localStrategy.js(전략코드) 가 실행이 되는건지 모르겠습니다. 'local'이라는 매개변수가 있다고 해도 localStrategy.js를 실행하라는 뜻은 아닐것인데 말이죠. 로그인 구현 흐름 자체는 이해가 되나 이쪽 부분이 어떤 논리로 이어지는건지를 모르겠습니다.
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
변수선언시 var로 하면 안되나요?
변수 선언시 let으로 하시는데 var로 하면 안되는건가요 ?