안녕하세요 저는 강사님 커리큘럼을 따르고 있는 학부생입니다. 학교 전공수업에 오픈소스 교육자료를 만드는 과제가 있습니다 소프트웨어 툴, 개발 도구 등에 대한 동영상 강의를 제공하는 비영리의 관련 학교 채널 유트브에 올라갈것이며 동영상에는 (CC BY-NC 4.0) 라이센스가 적용되어 올라갈것 같습니다 이 동영상에서 스프링의 기초적인 내용을 설명하기 위해 제가 배웠던 강사님의 강의내용을 바탕으로 30~40분 분량의 관련 교육 영상을 만들고 싶습니다. 물론 강의내용을 그대로 사용하지않고 부분부분 배운내용을 기반으로 요약하는 식으로 영상을 만들 생각입니다 김영한 강사님 강의의 ppt 자료는 사용하지않고 따로 제가 만들어서 사용할 것 이지만 강의에서 사용된 예제 코드(member service예제) 및 배운내용을 사용해도 저작권에 문제가 없을지 출처를 남겨야한다면 동영상에 어떤식으로 출처를 남기면 좋을지 문의드립니다
안녕하세요 비전공자 직장인입니다. 퇴근후 딴짓 님 강의를 열심히 듣고 있습니다. 현재 작업형2 모의문제 2를 혼자서 풀고 있는데, 단순한 결측치 찾고, 샘플 찾고, 그런 것들은 하겠는데 이거를 모델링 하는 거에서부터 사실 멘붕입니다. 작업형1 모의문제를 풀 때도 똑같이 강의를 듣던것보다 더 어려워서 멘붕이 왔었습니다. 일단은 모르겠는 부분은 인지한 상태로 다시 반복하겠다는 의지로 계속 강의를 듣는 게 맞겠죠? 반복이 답이겠죠??
선생님, 강의 열심히 보고 있는데 제가 5월 중순부터 시작하면서 조금 일찍 시작했는데도 불구하고 암기 할 게 너~~~~~~무 많아서 큰일입니다 ㅠㅠ 단권화 시키려고 실기용 교재를 샀는데 정말 정말 이것만큼은 꼭! 외우고 가야하는 코드나 문법같은거를 정리해주실 수 있나요? (강의나...파일로) 사실 고득점 합격은 바라지도 않고 60점 턱걸이로라도 너무 붙고싶습니다!
안녕하세요. 강의를 듣다가 idea 커맨드를 실행하였으나 먹히지 않아 찾아본 결과 Jetbrains Toolbox를 사용하여 설치한 경우에 실행 쉘 스크립트를 지원하는 것 같습니다. https://www.jetbrains.com/help/idea/working-with-the-ide-features-from-command-line.html#e3487884 툴박스 설치 $ brew install --cask jetbrains-toolbox 툴박스 UI에서 IntelliJ 설치 IntelliJ 설정에서 셸 스크립트 이름 확인 가능 만약 툴박스를 사용하지 않고 수동 설치한 경우 아래와 같이 수동으로 쉘 스크립트를 작성해야 사용 가능합니다. $ sudo vim /usr/local/bin/idea #!/bin/sh open -na "IntelliJ IDEA.app" --args "$@" $ sudo chmod +x /usr/local/bin/idea 저와 같은 고민을 하고 계신분에게 도움이 되었으면 합니다. 감사합니다.
설명 PathPattern 공식 문서 ? : 한 문자 일치 /pages/t?st.html YES: /pages/test.html , /pages/tXst.html NO : /pages/toast.html * : 경로( / ) 안의 모든 문자 일치 /resources/*.png YES: /resources/photo.png NO : /resources/favority.ico ** : 하위 경로 모든 문자 일치 /resources/** /resources/image.png , /resources/css/spring.css {spring} : spring 이라는 변수로 캡처 /resources/{path} /resources/robot.txt -> path 변수에 "robot.txt" 할당 @PathVariable("path") 로 접근 가능 {*spring} : 하위 경로 끝까지 spring 변수에 캡쳐 /items/{*path} /items/1/add -> path 변수에 "/1/add" 할당 {spring:[a-z]+} : 정규식 이용 /items/{path:[a-z]+} YES: /items/robots NO : /items/123 예제 1 - {*spring} @GetMapping("/hello/{*name}") @ResponseBody public String handleTest( @PathVariable String name ) { log.info("name = {}", name); return name; } GET http://localhost:8080/hello/path-test -> name = /path-test === GET http://localhost:8080/hello/path-test/other -> name = /path-test/other 예제 2 - 정규식 @GetMapping("/static/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}") @ResponseBody public String handle( @PathVariable String name, @PathVariable String version, @PathVariable String ext ) { log.info("name = {}", name); log.info("version = {}", version); log.info("ext = {}", ext); return "/" + name + "/" + version + "/" + ext; } GET http://localhost:8080/pathtest-1.0.0.jar -> name = pathtest version = 1.0.0 ext = .jar 잘못된 사용 @GetMapping("/static/{*fullpath}{name}") @ResponseBody public String runtimeError( @PathVariable String fullpath, @PathVariable String name ) { log.info("fullpath = {}", fullpath); log.info("name = {}", name); return name; } Description: Invalid mapping pattern detected: /static/{*fullpath}{name} ^ No more pattern data allowed after {*...} or ** pattern element {*...} 또는 ** 패턴 요소 다음에는 다른 패턴 데이터 를 사용할 수 없습니다.
현재 국비 학원을 수료하며 프로젝트를 마친 뒤에 김영한님 강의를 듣고 있으며 spring에 대해 이제서야 이해하려 하는 취준생입니다. 문득 제가 어떤 개발을 하고 싶은지 방향성에 대해 생각해보게 되었습니다. ->어떤 개발을 하고 싶은지 방향성에 대해 되짚어 보고 있었다 ->SQL문을 짜면서 효율적인 방법은 무엇이 있을까 고민하는 과정이 스스로 가치 있는 고민을 하고 있다는 생각이 들었다. ->데이터 처리 속도 개선에 관하여 고민하는 개발자가 되고 싶다. ->대용량 트래픽을 다루는 서비스 회사에서 성장하고 싶다. 질문 ==> 위의 4문장을 설득력 있게 말하기 위해서 취준에 뛰어드는 예비 백엔드 개발자 수준에서 할 수 있는 "공부 방향"은 무엇이 있을지 조언 해주실 수 있을까요? (특정 개념이나 강의를 추천해주셔도 감사할 것 같습니다. )
안녕하세요 프로젝트 swagger에 대한 질문입니다 ㅠㅠ아시는분있으면 꼭 답해주시기 바랍니다 코드 게시물 관련 프로젝트입니다. 나의 페이지에서 코드 게시물을 검색할수 있는 필터링 조건과 다른 유저 페이지에서 코드 게시물을 검색할수 있는 필터링 조건이 다른 상황입니다. api 설계시 위 두 api를 모두 "/codebox/{nickname}"으로 동일한 상황이고 @RequestBody로 받는 JSON 데이터들은 다르기 때문에 Controller에서 @GetMapping("/codebox/{nickname}")으로 동일하나 나의 페이지 접속시 토큰을 추가로 hearder에 받게 하여 아래와 같이 분리하여 구현된 상황입니다. 여기서 Swagger를 통해 api명세서를 자동으로 생성하게 되면 같은 리소스(같은 uri)에 대해서는 api가 한개 생성됩니다. 저는 아래 두가지 경우를 모두 api 명세서로 보여지게 생성하고 싶은데 여러가지 방법을 찾아보는데 마땅히 나오지 않아 질문드립니다.ㅠㅠ 아시는 분 있으시면 꼭 좀 댓글달아주시기 바랍니다.ㅠㅠ @GetMapping(value = "/{nickname}", headers = JwtProperties.ACCESS_HEADER_STRING) @UserAuthen @UserAuthor @ApiOperation(...) @ApiResponses({ ... }) @ApiImplicitParams({ @ApiImplicitParam(name = "nickname", value = "회원 닉네임", required = true), @ApiImplicitParam(name = JwtProperties.ACCESS_HEADER_STRING, value = "엑세스 토큰", required = true) }) public DataResponse<PostListResponse> userPage2(@PathVariable("nickname")String nickname, @RequestHeader(JwtProperties.ACCESS_HEADER_STRING) String accessToken, @RequestBody SearchFormAboutOtherUserPost form) { ..... } @GetMapping(value = "/{nickname}", headers = {JwtProperties.ACCESS_HEADER_STRING, JwtProperties.MYSESSION_HEADER_STRING}) @UserAuthen @UserAuthor @ApiOperation(...) @ApiResponses({ ... }) @ApiImplicitParams({ @ApiImplicitParam(name = "nickname", value = "회원 닉네임", required = true), @ApiImplicitParam(name = JwtProperties.ACCESS_HEADER_STRING, value = "엑세스 토큰", required = true), @ApiImplicitParam(name = JwtProperties.MYSESSION_HEADER_STRING, value = "마이페이지 엑세스 토큰", required = true) }) public DataResponse<PostListResponse> userPage3(@PathVariable("nickname")String nickname, @RequestHeader(JwtProperties.ACCESS_HEADER_STRING) String accessToken, @RequestHeader(JwtProperties.MYSESSION_HEADER_STRING) String my_sessionToken, @RequestBody SearchFormAboutSelfUserPost form) { .... }
기술 면접이나 면접 과제 중 인증, 인가 또는 사용자 정보 암호화(jwt) 관련된 과제들도 많이 출제가 되더라구요 프로젝트 진행하면서 회원가입, 로그인 구현 시 코드를 끌어다 사용해 구현은 했었지만 사실 너무 복잡하고 어려워서 사실 그 부분에 대한 질문이 들어오면 입도 못 뗄 것 같아요... 보안 관련 시리즈도 기대 해봅니다!! 영한 튜터님 강의 보면서 정말 즐겁게 공부하고 있어요:)
plugins { id 'org.springframework.boot' version '2.7.4' id 'io.spring.dependency-management' version '1.0.14.RELEASE' id 'java' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' 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" implementation "com.querydsl:querydsl-core" implementation "com.querydsl:querydsl-collections" annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정 annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드 annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드 } tasks.named('test') { useJUnitPlatform() } // Querydsl 설정부 def generated = 'src/main/generated' // querydsl QClass 파일 생성 위치를 지정 tasks.withType(JavaCompile) { options.getGeneratedSourceOutputDirectory().set(file(generated)) } // java source set 에 querydsl QClass 위치 추가 sourceSets { main.java.srcDirs += [ generated ] } // gradle clean 시에 QClass 디렉토리 삭제 clean { delete file(generated) } 해당 소스는 타사 강의 보다가 본 설정에서 가져왔습니다. 기존 영한님 강의와 다른 점이 3가지 있으니 주의하시기 바랍니다. Querydsl Q파일 생성 위치가 다릅니다. 기존 영한님 강의대로 $build 로 시작하는 설정을 사용하면 테스트 실행 시 Q파일의 위치를 찾지 못해서 테스트가 실패합니다. Gradle -> Tasks -> build -> clean Gradle -> Tasks -> build -> build 혹은 classes 기존 영한님 교안에는 빌드 시 Gradle -> Tasks -> other -> compileQuerydsl 로 Q파일을 생성하지만, 이 방법의 경우 other에 해당 메뉴가 없습니다. 그래서 빌드 시에는 그냥 build 메뉴의 build 혹은 classes 로 빌드하시면 Q파일이 생깁니다. 영한님 강의에서는 gradle build 폴더가 대부분 git 버전관리에 포함되지 않으므로 따로 설정할 필요가 없지만, 이 경우 Q파일이 소스폴더에 들어가므로 .gitignore 에 아래와 같이 별도로 경로를 설정해 주어야 합니다. ### Querydsl /src/main/generated 혹시 저같이 청개구리마냥 강의에 나온 버전 사용 안 하고 최신 버전 사용하시는 분들께 도움이 되었으면 좋겠습니다. 저도 타사 강의에서 가져온 것이고 기초 테스트만 통과한 것이라서 혹시 강의에 맞지 않는 경우 영한님이나 다른 분들이 추가 정보를 주시면 좋을 것 같습니다. 여담인데 QueryDSL은 쿼리 짜긴 확실히 편한데 설정이 버전마다 중구난방이라 불편합니다. 똑똑한 개발자분들이 이런 설정도 그냥 @Configuration 으로 빼버리는 거 만들어주지 않을까 하는 기대가 있긴 합니다.