묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결이미지 관리 풀스택(feat. Node.js, React, MongoDB, AWS)
Promise.all에 대한 질문
선생님 안녕하세요.이번 강의에서 사용된 Promise.all이 뭔지 몰라서찾아보니 async-await를 사용하면 비동기 동작의 상태가 완료될 때까지 기다린 후 다음 코드를 순차적으로 읽어나가다보니 이렇게 기다리는 시간을 개선하기 위해 Promise들을 병렬로 처리해 주는 것으로 확인됩니다.근데 이번 강의에서 Promise.all을 빼고 이미지를 업로드해보면 아래의 사진처럼 네트워크의 preview에서 아무 값도 담기지 않게 됩니다.Promise.all이 처리속도를 개선해 주기 위한 기능이라면 Promise.all을 사용하지 않아도 우선 값은 담겨야 하는게 아닐까 하는 생각이 드는데 왜 값이 담기지 않게 되는지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
mysql.server start 에러
M1 Macbook Pro입니다. brew로 mysql 설치 후 mysql.server start를 하면 아래 메시지가 반겨주네요. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/Wons-MacBook-Pro.local.pid).어찌해야 될까요? 설 연휴에 죄송합니다^^
-
미해결지금 당장 데브옵스 AWS
서버리스 람다
안녕하세요!혹시 서버리스 람다 관련해서도 업데이트 해주실 의향 있으실까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
QueryDsl 추가 과정에서 질문이 있습니다..
안녕하세요 선생님. Querydsl 설정하는 부분에서 질문이 있습니다.호돌맨님 강의영상처럼 똑같이 보고 따라했는데 제꺼에선 Q클래스를 인식하지를 못 하더라구요.제가 기존에 영한님 강의에 익숙해져서 빌드 도구를 gradle이 아니라 인텔리제이로 해놨었거든요.그래서 혹시 몰라 gradle로 바꾸니 이제 QClass가 잘 생성이 되네요.혹시 이 부분은 어느 키워드로 검색을 해야할까요..?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
PostCreate 기본 생성자 문제 질문드립니다.
우선 수업 잘 듣고 있습니다 호돌맨님! 많이 배우고 있어요 ㅎㅎ제목에서와 같이 PostCreate 부분에서 기본 생성자에 관해 질문을 드립니다. // @Setter @Getter @NoArgsConstructor // TODO: 왜 이게 꼭 있어야 하는 것일까? public class PostCreateDto { @NotBlank(message = "타이틀을 입력해주세요.") private String title; @NotBlank(message = "내용을 입력해주세요.") private String content; @Builder public PostCreateDto(String title, String content) { this.title = title; this.content = content; } }우선 이건 제 코드입니다. 보시면 제 코드에는 @NoArgsConstructor 어노테이션이 있는데요. 이 부분이 없으면 제 PostControllerTest에서는 테스트 실패가 뜨더라구요. 에러 메시지는 다음과 같습니다. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.blog.request.PostCreateDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)에러메시지를 읽어보니 생성자가 없다는 문제 같아서 @NoArgsConstructor 어노테이션을 붙여보니 정상적으로 작동을 하더군요.이 부분이 궁금해서 찾아보니 RequestBody로 넘어오는 데이터를 맵핑할 때 Jackson의 ObjectMapper가 사용되는데 이게 RequestBody를 생성할 때, DTO가 Property기반이 아니거나 Delegate를 한 상태가 아니라면 기본 생성자로 생성한다 라고 나와있네요. (https://velog.io/@conatuseus/RequestBody%EC%97%90-%EC%99%9C-%EA%B8%B0%EB%B3%B8-%EC%83%9D%EC%84%B1%EC%9E%90%EB%8A%94-%ED%95%84%EC%9A%94%ED%95%98%EA%B3%A0-Setter%EB%8A%94-%ED%95%84%EC%9A%94-%EC%97%86%EC%9D%84%EA%B9%8C-3-idnrafiw)그리고 바인딩할 때 Setter가 없이도 자바 리플렉션을 통해서 DTO에 값이 들어간다고 하는 것도 이번에 알게 됐네요. 그래서 Setter를 지우고 Getter랑 @NoArgsConstructor 어노테이션만 붙이고 테스트를 돌려보니 통과가 잘 됩니다. 그런데 호돌맨님이 올려주신 코드를 보니 PostCreate 부분에 기본생성자가 없더라구요. 그런데도 테스트통과가 잘 되는 것을 보니까 신기하네요. 어떻게 그게 가능한 것인지 설명해주실 수 있나요?
-
미해결AWS(Amazon Web Service) 입문자를 위한 강의
ACL(액세스 제어 목록) 편집 비활성화
cutty.jpeg > 권한 > acl(액세스 제어 목록) 편집이 눌리지가 않는데 어떻게 조치해야 될까요?
-
해결됨스스로 구축하는 AWS 클라우드 인프라 - 기본편
아키텍처 구성의 대한 질문
마지막 오토스케일링부분을 지금 현재 진행중인데기존에 설정해놓은 인스턴스를 모두 중지나 삭제하고나서오토스켈링 프라이빗 AMI로 인스턴스 올려서 진행하는건지금 현재 아키텍처의 구성을 중간에 날려버리는게 아닌가 싶어서요 강의듣는게 좋앗던건 아키텍처를 구성하는것에 실습과 이론을 배우고싶어서 진행했는데 내용은 전반적으로 너무 좋은데기존에것이 없어져서 실제로 처음에 보여진 아키텍처에서 프라이빗 서브넷 부분만 남아 있는데 기존 퍼블릭 부분도 다시 살려서 연동 할수 있는 부분 가이드 부탁 드립니다.
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
키보드 소리가 너무좋은데..
강의외적 질문이지만.. 혹시 어떤 키보드를 쓰고계신지 알수있을까요..? 소리가 너무 좋아서 악기같아요
-
미해결AWS Certified Advanced Networking - Specialty 자격증 준비하기
강의 업데이트
현재 시험에 맞는 강의일까요?혹시 아직 업데이트 안된거라면, 답변 부탁드립니다.다른 방법으로 공부를 해야할 것 같아서요!!
-
해결됨스스로 구축하는 AWS 클라우드 인프라 - 기본편
AMI 이미지 생성 문제
public-ec2-a1 인스턴스 생성 후 강의 대로 PHP 작성하여이미지를 만들어서 해당 이미지로 c1 인스턴스를 생성하여서문제없이 유저 데이터 대로 httpd 도 실행중으로 확인되는데index.php가 아닌 index.html로 만들어져 있고 해당 공유주신 파일이 아닌그저 ip 주소만 텍스트로 나오는 페이지만 출력이 되는데..혹시 php 파일은 이미지화 해도 안넘어와 지나요? 선수 작업이 있는걸까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
QClass가 생성되지만 import가 안되는 문제에 관하여
plugins { id 'java' id 'org.springframework.boot' version '2.7.7' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'com.tony' 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' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'com.querydsl:querydsl-core' implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor 'jakarta.persistence:jakarta.persistence-api' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' }안녕하세요 호돌맨 선생님 질문이 있습니다.위와 같은 build.gradle 로 했을시에 build/generated에 QPost.java 가 생성되는것을 확인했지만실제 PostRepositoryImpl에서 import를 해올수 없었습니다.구글링을 하며 여러 시도를 했었지만 다 실패해더라구요하지만 운좋게 아래와 같은 설정( https://velog.io/@soyeon207/QueryDSL-Spring-Boot-%EC%97%90%EC%84%9C-QueryDSL-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 )을 찾아서 import하는데 성공했습니다.plugins { id 'java' id 'org.springframework.boot' version '2.7.7' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'com.tony' 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' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'com.querydsl:querydsl-core' implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor 'jakarta.persistence:jakarta.persistence-api' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } def querydslSrcDir = 'src/main/generated' sourceSets { main { java { srcDirs += [ querydslSrcDir ] } } } compileJava { options.compilerArgs << '-Aquerydsl.generatedAnnotationClass=javax.annotation.Generated' } tasks.withType(JavaCompile) { options.generatedSourceOutputDirectory = file(querydslSrcDir) } clean { delete file(querydslSrcDir) } tasks.named('test') { useJUnitPlatform() } 이 방식으로 하면 build/generated에는 프로젝트 폴더들만 생기고 src/main/generated에 Post.java 가 생겨서 PostRepostioryImpl에도 잘 import가 되는데 이렇게 해도 추후에 문제가 되는부분이 있을까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
테스트 전체 실행시 id 값이 4부터 시작하는 현상
@SpringBootTest @AutoConfigureMockMvc @PropertySource("classpath:messages.properties") class PostControllerTest { @Autowired private ObjectMapper mapper; @Autowired private Environment environment; @Autowired private MockMvc mockMvc; @Autowired private PostRepository postRepository; @BeforeEach void clean() { postRepository.deleteAll(); } @Test @DisplayName("/posts 요청시 Hello World를 출력한다.") void test() throws Exception { // given PostCreate request = PostCreate.builder() .title("제목입니다.") .content("내용입니다.") .build(); String json = mapper.writeValueAsString(request); // expected mockMvc.perform(MockMvcRequestBuilders.post("/posts") .contentType(MediaType.APPLICATION_JSON) .content(json) // .content("{\"title\": \"hithere\", \"content\": \"blah\"}") ) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().string("")) .andDo(print()); } @Test @DisplayName("/posts 요청시 title 값은 필수다.") void test2() throws Exception { Class<? extends PostControllerTest> aClass = getClass(); ClassLoader classLoader = getClass().getClassLoader(); URL resource = classLoader.getResource("messages.properties"); // given PostCreate request = PostCreate.builder() .content("내용입니다.") .build(); String json = mapper.writeValueAsString(request); // expected mockMvc.perform(MockMvcRequestBuilders.post("/posts") .contentType(MediaType.APPLICATION_JSON) .content(json) ) .andExpect(MockMvcResultMatchers.status().isBadRequest()) .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("400")) .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("잘못된 요청입니다.")) .andExpect(MockMvcResultMatchers.jsonPath("$.validation.title").value(environment.getProperty("post.NotBlank"))) .andDo(print()); } @Test @DisplayName("/posts 요청시 db에 값이 저장된다.") void test3() throws Exception { // given PostCreate request = PostCreate.builder() .title("제목입니다.") .content("내용입니다.") .build(); String json = mapper.writeValueAsString(request); // expected mockMvc.perform(MockMvcRequestBuilders.post("/posts") .contentType(MediaType.APPLICATION_JSON) .content(json) ) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(print()); // then assertEquals(1L, postRepository.count()); Post post = postRepository.findAll().get(0); assertEquals("제목입니다.",post.getTitle()); assertEquals("내용입니다.",post.getContent()); } @Test @DisplayName("글 1개 조회") void test4() throws Exception { // given Post post = Post.builder() .title("123456789012345") .content("bar") .build(); postRepository.save(post); // when // expected mockMvc.perform(MockMvcRequestBuilders.get("/posts/{postId}",post.getId()) .contentType(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(post.getId())) .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("1234567890")) .andExpect(MockMvcResultMatchers.jsonPath("$.content").value("bar")) .andDo(print()); // then } @Test @DisplayName("글 여러개 조회") void test5() throws Exception { // given List<Post> requestPosts = IntStream.range(1,31) .mapToObj(i -> Post.builder() .title("title " + i) .content("content " + i) .build() ).collect(Collectors.toList()); postRepository.saveAll(requestPosts); // expected mockMvc.perform(MockMvcRequestBuilders.get("/posts?page=1&sort=id,desc") .contentType(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.length()",Matchers.is(5))) .andExpect(MockMvcResultMatchers.jsonPath("$[0].id").value(30)) .andExpect(MockMvcResultMatchers.jsonPath("$[0].title").value("title 30")) .andExpect(MockMvcResultMatchers.jsonPath("$[0].content").value("content 30")) .andDo(print()); } }안녕하세요 호돌맨님 질문이 있습니다.test5를 단독으로 실행하면 문제없는데전체를 실행했을 때는 postRepository.saveAll 전까지는 requestPosts 안에 Post가 id가 1부터 시작하는데saveAll을 지나고 나서는 id가 4부터 시작하게됩니다.@BeforeEach에서 postRepository.deleteAll을 수행하고 있습니다. 제생각에는 이게 Entity 의 @GeneratedValue(strategy = GenerationType.IDENTITY) 와 연관이 있는건가요?해당 설정을 하면 말씀해주신것처럼 persist가 호출되는 시점에 id값을 db로부터 얻어오기 때문에 아무리 row가 지워졌어도 h2 내부적으로 id를1씩 증가시켜왔기에 그 증가된 값이 requestPosts 의 값도 변형시킨것이 맞나요?
-
해결됨스스로 구축하는 AWS 클라우드 인프라 - 기본편
cloudfront 부분 수강중
선생님이 하신것과는 다르게 x-chche가 hit가아닌 miss라고뜨는데 뭐가 문제일까요?? 선생님 수업을 차근차근따라했는데...그리고 f5키를 여러번누르면 선생님 화면에서는 여러번 car.jpg가 뜨지만 제화면에서는 하나만 뜹니다.이렇게요... 알려주시면 감사하겠습니다
-
미해결AWS(Amazon Web Service) 입문자를 위한 강의
index.html 이 time_out과 함께 동작하지 않는 경우 해결법
인스턴스 클릭 후보안 탭에서 보안그룹 설정을 바꿔줘야 합니다.기본 설정이 인바운드 규칙에 TCP만 오픈되어있습니다. Actions보안> 보안 그룹 id 클릭 >>인바운드 규칙 > 인바운드 규칙 편집 > 규칙 추가>HTTP, HTTPS 추가 : 소스 -> 사용자지정 : 내IP>규칙 저장
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
500 에러가 납니다..
docker-compose up이후에 build는 다 되서 메인페이지는 열리지만 이렇게 에러가 납니다. 제가 한게 이상한가 싶어서 깃허브에 있는 코드로 docker-compose up해도 저런 오류가 나는데 무슨 문제인지 궁금합니다..!
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
docker-compose.yml 수정 후
안녕하세요. 강의 잘 듣고 있습니다!배포 후 AWS에서 에러난 것을 수정 해주신 코드 보며 잘 해결했습니다.궁금한 점이 docker-compose.yml 내부 코드를 수정하고 나서 다시 터미널에 docker-compose up --build를 해서 컨테이너를 만들고 깃허브에 푸쉬를 해야 하는 지 아니면 바로 깃허브에 푸쉬하면 되는 것인지 궁금합니다.이번에는 혹시 몰라서 빌드를 하고 푸쉬하니 배포는 잘 됐습니다!
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
Windows Volume 내용 변경안됨
안녕하세요 Windows 환경에서 Volume 적용 후 내용을 변경하였는데 반영이 안되는데 이유가 어떻게 될까요 docker build -t smileajw1004/nodejs ./docker run -d -p 5000:8080 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app smileajw1004/nodejs 실행은 정상적으로 이루어지나 소스 수정 후 반영이 안됩니다. 아래 글에 댓글에는 볼륨에 이상이있다 라고만 써주셔서 해결책이 없는데 혹시 방법이 없는건가요
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
Lightsail에 들어가지 못하면 강의 진행이 안될까요?
현재 Lightsail에 들어가지지 않는데... 이러면 강의 진행이 어려울까요...?
-
해결됨스스로 구축하는 AWS 클라우드 인프라 - 기본편
NAT GW, LB 관련 문의
안녕하세요~!외부에서 사용자가 EC2 웹서버 접근할때 LB를 통해서 들어오고,패킷이 다시 LB를 통해서 나가는게 맞지 않나요??LB로 들어온 패킷이 NAT로 나가는게 잘 이해가 안되서요..NAT는 EC2에서 외부 통신이 필요할때 쓰는걸로 알고있는데,헷갈려서 문의드려요~!
-
미해결mongoDB 기초부터 실무까지(feat. Node.js)
mongodb connect
await mongoose.connect(MONGO_URI, {useNewUrlParser : true , useUnifiedTopology:true , useCreateIndex:true}); useCreateIndex:true}이부분을 추가시 mongodb 6.0이상 버전에서MongoParseError: option usecreateindex is not supported위와 같은 에러가 발생합니다.