묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 내부호출 1 질문이 있습니다
고급편을 듣고 이 강의를 들었으면 알 수 있을 것 같은 내용이지만, 다른 분들을 위해 또 성격이 급해서 질문을 남깁니다. CallService의 프록시 객체는 CallService를 상속받은 자식 객체로 이해했는데요. 언뜻 생각하기로는 internal을 내부 호출을 하더라도 override된 internal이 호출되기 때문에 트랜잭션이 적용될 것 같다는 생각이 드는데, 간단하게라도 이렇게 동작하지 않는 이유를 알 수 있으면 좋겠습니다. 검색을 해보니 AOP가 런타임에 인터셉트 하는 방식으로 동작하기 때문에 그렇다고 하는데요. 그렇다면 왜 override 하는 방식으로 구현하지 않았는지도 궁금해집니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
ORDERS와 DELIVERY 관계에 대한 질의입니다.
안녕하세요. 강의 수강 도중 제가 이해를 잘하지 못하여 질문 남기게 되었습니다. 16:28~ 부분에서주문과 배송의 경우 일대일 단방향 관계라고 말씀하셨는데, 회원 엔티티 분석 이미지를 보았을 때Order 에서 delivery: Delivery,Delivery 에서 order: Order 이면단방향이 아니라 양방항 관계인 것 같은데 왜 단방향 관계인지 궁금합니다. ㅜ
-
미해결PHP 7+ 프로그래밍: 객체지향
http://localhost:8080/posts/1 접근시 배열 0값 표기 오류
Route::add('get','/posts/{id}', function($id){ echo ($id); var_dump(Adaptor::getAll('select * from posts where `id`= ?', [ $id ] )); });route.php public static function add($method, $path, $handler, $middlewares = []) { self::$contexts[] = new RequestContext($method, $path, $handler, $middlewares); } 위처럼 불러와도배열 표기가 아무것도 안나오는데 어떤부분을 확인해야 강의처럼 내용확인이 가능할까요?{id}array(0) { } 이렇게만 표기 됩니다.$id값을 못 읽는것 같은데 어떻게 해결해야 할지 모르겠네요
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
게시글 좋아요 부분 강의에서 하트색이 바로 변하지 않습니다
에러는 없고 데이터에서도 like하고 unlike가 잘되는건 확인했는데 화면에서는 새로고침 해야지만 바뀌네요그리고 좋아요하고 다시 눌러서 취소 할려는데 취소가 안되고 계속 중복으로 좋아요가 됩니다 const express = require("express"); const { Post, Image, Comment, User } = require("../models"); const { isLoggedIn } = require("./middlewares"); const router = express.Router(); router.post("/", isLoggedIn, async (req, res, next) => { try { const post = await Post.create({ content: req.body.content, userId: req.user.id, }); const fullPost = await Post.findOne({ where: { id: post.id }, include: [ { model: Image, }, { model: Comment, include: [ { model: User, // 댓글 작성자 attributes: ["id", "nickname"], }, ], }, { model: User, // 게시글 작성자 attributes: ["id", "nickname"], }, { model: User, // 좋아요 누른 사람 as: "Likers", attributes: ["id"], }, ], }); res.status(201).json(fullPost); } catch (error) { console.error(error); next(error); } }); router.post("/:postId/comment", isLoggedIn, async (req, res, next) => { try { const post = await Post.findOne({ where: { id: req.params.postId }, }); if (!post) { return res.status(403).send("존재하지 않는 게시글입니다"); //return을 붙여줘야지 send하고 밑에 json이 동시에 실행안됨 } const comment = await Comment.create({ content: req.body.content, PostId: req.params.postId, userId: req.user.id, }); const fullComment = await Comment.findOne({ where: { id: comment.id }, include: [ { model: User, attributes: ["id", "nickname"], }, ], }); res.status(201).json(fullComment); } catch (error) { console.error(error); next(error); } }); router.patch("/:postId/like", isLoggedIn, async (req, res, next) => { try { const post = await Post.findOne({ where: { id: req.params.postId }, }); if (!post) { return res.status(403).send("게시글이 존제하지 않습니다"); } await post.addLikers(req.user.id); res.json({ PostId: post.id, userID: req.user.id }); } catch (error) { console.error(error); next(error); } }); router.delete("/:postId/like", isLoggedIn, async (req, res, next) => { try { const post = await Post.findOne({ where: { id: req.params.postId }, }); if (!post) { return res.status(403).send("게시글이 존제하지 않습니다"); } await post.removeLikers(req.user.id); res.json({ PostId: post.id, userID: req.user.id }); } catch (error) { console.error(error); next(error); } }); router.delete("/", (req, res) => { res.json({}); }); module.exports = router; const express = require("express"); const { Post, Image, User, Comment } = require("../models"); const router = express.Router(); router.get("/", async (req, res, next) => { try { const posts = await Post.findAll({ limit: 10, order: [ ["createdAt", "DESC"], [Comment, "createdAt", "DESC"], ], //옵션 = ASC: 오름차순 include: [ { model: User, attributes: ["id", "nickname"], //아이디 ,닉네임만 가져오기 }, { model: Image, }, { model: Comment, include: [ { model: User, attributes: ["id", "nickname"], }, ], }, { model: User, // 좋아요 누른 사람 as: "Likers", attributes: ["id"], }, ], }); res.status(200).json(posts); } catch (error) { console.error(error); next(error); } }); module.exports = router; import { Card, Button, Avatar, Popover, List, Comment } from "antd"; import { RetweetOutlined, HeartOutlined, MessageOutlined, HeartTwoTone, EllipsisOutlined, } from "@ant-design/icons"; import { useDispatch, useSelector } from "react-redux"; import PropTypes from "prop-types"; import PostImages from "./PostImages"; import { useCallback, useEffect, useState } from "react"; import CommentForm from "./CommentForm"; import PostCardContent from "./PostCardContent"; import FollowButton from "./FollowButton"; import { REMOVE_POST_REQUEST, LIKE_POST_REQUEST, UNLIKE_POST_REQUEST, } from "../reducers/post"; const PostCard = ({ post }) => { const dispatch = useDispatch(); const { removePostLoading } = useSelector((state) => state.post); const [commentFormOpened, setCommentFormOpened] = useState(false); const id = useSelector((state) => state.user.me?.id); const onLike = useCallback(() => { if (!id) { return alert("로그인이 필요합니다."); } dispatch({ type: LIKE_POST_REQUEST, data: post.id, }); }, [id]); const onUnLike = useCallback(() => { if (!id) { return alert("로그인이 필요합니다."); } dispatch({ type: UNLIKE_POST_REQUEST, data: post.id, }); }, [id]); const onToggleComment = useCallback(() => { setCommentFormOpened((prev) => !prev); }, []); const onRemovePost = useCallback(() => { dispatch({ type: REMOVE_POST_REQUEST, data: post.id, }); }, []); const liked = post.Likers.find((v) => v.id === id); console.log("@@@", liked); return ( <div style={{ marginBottom: 10 }}> <Card cover={post.Images[0] && <PostImages images={post.Images} />} actions={[ <RetweetOutlined key="retweet" />, liked ? ( <HeartTwoTone twoToneColor="#eb2f96" key="heart" onClick={onUnLike} /> ) : ( <HeartOutlined key="heart" onClick={onLike} /> ), <MessageOutlined key="message" onClick={onToggleComment} />, <Popover key="more" content={ <Button.Group> {id && post.user?.id === id ? ( <> <Button>수정</Button> <Button type="danger" onClick={onRemovePost} loading={removePostLoading} > 삭제 </Button> </> ) : ( <Button>신고</Button> )} </Button.Group> } > <EllipsisOutlined /> </Popover>, ]} extra={id && <FollowButton post={post} />} > <Card.Meta avatar={<Avatar>{post.user?.nickname[0]}</Avatar>} title={post.user?.nickname} description={<PostCardContent postData={post.content} />} /> </Card> {commentFormOpened && ( <div> <CommentForm post={post} /> <List header={`${post.Comments.length}개의 댓글`} itemLayout="horizontal" dataSource={post.Comments} renderItem={(item) => ( <li> <Comment author={item.user?.nickname} avatar={<Avatar>{item.user?.nickname[0]}</Avatar>} content={item.content} /> </li> )} /> </div> )} </div> ); }; PostCard.propTypes = { post: PropTypes.shape({ id: PropTypes.number, user: PropTypes.object, content: PropTypes.string, createdAt: PropTypes.string, Comment: PropTypes.arrayOf(PropTypes.object), Images: PropTypes.arrayOf(PropTypes.object), Likers: PropTypes.arrayOf(PropTypes.object), }).isRequired, }; export default PostCard;
-
미해결[NarP Series] MVC 프레임워크는 내 손에 [나프2탄]
강의자료
안녕하세요 !! 수업잘듣고있습니다.혹시 08_MVC05 Project(핵심정리) 수업때 강의용 파워포인트도 다운받을수 있는건가요 ? ㅎ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입에서 insert 쿼리는 뜨는데 h2 db에 저장이 안됩니다.
yml 파일spring: #띄어쓰기 없음 datasource: #띄어쓰기 2칸 url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true defer-datasource-initialization: true logging: level: org.hibernate.SQL: debug # org.hibernate.type: traceMemberController 파일package jpaproject.jpashop.controller; import jpaproject.jpashop.domain.Address; import jpaproject.jpashop.domain.Member; import jpaproject.jpashop.service.MemberService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import javax.validation.Valid; @Controller @RequiredArgsConstructor public class MemberController { private final MemberService memberService; @GetMapping("/members/new") public String createForm(Model model){ model.addAttribute("memberForm",new MemberForm()); return "members/createMemberForm"; } @PostMapping("/members/new") public String create(@Valid MemberForm memberForm){ Address address = new Address(memberForm.getCity(), memberForm.getStreet(), memberForm.getZipcode()); Member member = new Member(); member.setName(memberForm.getName()); member.setAddress(address); memberService.join(member); return "redirect:/"; } }콘솔창h2 데이터베이스도저히 원인을 모르겠네요 도와주세요
-
미해결생활코딩 - React
1강부터 빠짐없이 따라했는데 10강의 pure.html이 안돼요
왤까요...pure.html 쳐도 계속 원래의 index.html만 나오네요ㅠ
-
미해결
웹페이지에서 파일 다운로드하는 방법
안녕하세요장고와 웹사이트 개발이 아예 처음인 신입개발자입니다.주 개발 업무는 아닌데 웹 사이트 구축이 필요해서 문의드립니다.해야하는건 웹사이트에서 웹서버에 있는 파일을 다운로드 하는 건데도저히 개념이 안서서요..사용툴은 장고입니다.질문은 다음과 같습니다.웹서버에 파일을 올리는 방법이 궁금합니다 올린 파일마다 url이 따로 존재하는 건가요?웹서버는 어떤걸 사용해야하나요?
-
해결됨캐글 Advanced 머신러닝 실전 박치기
컬럼 관련 질문
안녕하세요 선생님 항상 좋은 강의 감사드립니다.다름이 아니라 수업 마지막 즈음에, 퍼포먼스를 높이기 위해 컬럼을 많이 만든다고 하셨던 말씀에 궁금한 점이 생겨 질문을 드립니다.저번에 다른 수업에서 캐글에서 많은 사람들이 피처(컬럼)의 개수를 많게는 천개도 넘게 만들어놓고 성능을 평가하며 줄인다고 하셨던 걸로 기억을 합니다 (제 기억이 맞다면요!).그렇다면 컬럼을 만들 때 저의 상상 속의 로직?이 필요하다고 생각하는 모든 경우의 컬럼들을 만들어 놓은 다음에 plot importance 그래프에서 성능에 도움이 되지 않는 컬럼들은 drop해도 되는 걸까요? 아니면 성능이 큰 영향을 주지 않더라도 그대로 놔둬야 하는 걸까요?다시 정리해서 말씀드리면, 엄청나게 많은 컬럼들을 만들어 놓은 후에 나중에 성능에 별 도움이 되지 않는 컬럼들은 (순차적으로) drop하는게 맞는 걸까요? 놔둬야 할까요??감사합니다:)
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
board[ny][nx] 로 가야 하는거 아닌가요?
board[nx][ny]나 board[ny][nx] 나 상관은 없을 것 같긴한데 헷갈려서요!x를 x축이 아닌 그냥 의미없는 변수명으로 쓰신건가요??2차원 배열을 2중포문 돌면 y0 (x0, x1, x2...) y1 (x0, x1, x2...) 이런식으로 가면 y가 앞에 나와야하는것 같은데
-
해결됨코딩테스트 [ ALL IN ONE ]
코딩테스트 준비법이 궁금합니다
안녕하세요, 이번에 코테 입문하는 전자전기공학부 학생입니다.목표가 이번 하반기 대기업(제조, IT제외) 코테 준비로강의를 수강하면서 코딩문제풀이를 하려합니다. 현재 자료구조, 알고리즘에 대한 지식은 아예 없는 상태에서 어떤 코딩문제풀이를 해야할지 모르겠습니다. 공부법이나 문제풀이 사이트를 추천해주실 수 있을까요?
-
미해결스프링 배치
branch Part11 관련질문입니다.
안녕하세요 정수원 선생님 브랜치 Part11에 관해 동작문의가 2개 있습니다.1) SendJobConfiguration에서 apiJob이 제일 먼저 실행이 되는 job이고apiJob에서 apiStep1 (시작로그를 남기는) , apiStep2(끝냈다는 로그를 남기는) 사이에 주입받은 jobStep을 실행시키는데 이 jobStep은 SendChildJobConfiguration에 있는 jobStep 인가요? 2) 이후에 jobStep에서 apiMasterStep을 실행시키고 Partition으로 쪼개서 3개의 스레드에 할당할때는 apiSlaveStep에서 read부터 각 스레드가 담당하는것이 맞나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
id에 @NotEmpty를 한다면
@Data public class Member { @NotEmpty private Long id; @NotEmpty private String loginId; //로그인 ID @NotEmpty private String name; //사용자 이름 @NotEmpty private String password; }제가 실수로 id에 @NotEmpty를 하니까 회원가입 버튼을 눌렀더니 오류가 났습니다.오류가 나는 이유는 id의 오류처리를 안해서라고 생각하는 데 만약에 오류처리를 해야한다면MemberRepository의@Slf4j @Repository public class MemberRepository { private static Map<Long, Member> store = new HashMap<>(); //static 사용 private static long sequence = 0L; //static 사용 public Member save(Member member) { member.setId(++sequence); log.info("save: member={}", member); store.put(member.getId(), member); return member; } save() 메소드에서 하면 되는 걸까요??(id는 다른 필드들과 다르게 html에서 처리할 수 없으니까??)아니면 id는 데이터베이스에 들어가는 거니까 애초에 @NotEmpty 를 사용하면 안된다 라고 생각해야 건가요?? (개발자가 직접 입력한 것이 아니니까?)답변주시면 정말 감사하겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
navMeshAgent에서 맵을 bake 하는데 장애물 안쪽이 자꾸 bake가 됩니다.
장애물도 navigation static이고 not walkable인데도 저 안쪽이 자꾸 걸을 수 있는 곳으로 표시가 되어서 몬스터들이 랜덤으로 walkable좌표를 찍는데 저기로 잡아서 자꾸 벽안으로 기어들어갈려고합니다. 제기억에 장애물을 설치해 놓으면 그 안쪽도 당연히 장애물로 막혀서 걸을 수 없는 구역으로 나왔던거 같은데... 왜이러는 걸까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
google cloud storage의 keFilename
안녕하세요.fileUpload시 google cloud storage의 keyFilename 내용을 읽지 못하는듯 합니다.코드는 하기와 같고요. 실행시 아래와 같은 오류가 발생 합니다.경로 문제 일까요?
-
미해결실전! 스프링 데이터 JPA
클린 아키텍처에서 JPA
클린 아키텍처 (및 헥사고날) 설계 시 JPA 영속성 계층을 어디에 두어야하는지 궁금합니다.일반적으로 해당 아키텍처에선 영속성 계층을 도메인 계층에서 분리시켜야 한다고 주장하던데 (육각형 안 Entity는 POJO이며, JPA Entity는 바깥의 Adapter에 구현하고 Mapper로 변환하는 형식), 이렇게 되면 JPA가 제공하는 lazy loading이나dirty checking 등의 이점은 포기해야 되는것일까요?도메인 모델에 JPA 코드를 사용하자니 이러한 아키텍트 원칙에 위배되는거 같고, 그렇다고 이걸 분리해놓으면 따로 구현해야될게 많아지니 고민입니다..타협을 한다면 어느 방식으로 하는게 좋을까요? 애초에 이러한 아키텍트 방식과 JPA는 (지향점이 다르기에) 어울리지 않는 것일까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
수업 순서
프로그래밍을 이 강의로 처음 들어서 이해가 안 가는게 엄청 많은데 특히 Text RPG 부분이 어려워요 초반 강의랑 객체지향등 다른 강의를 다 듣고 Text RPG 강의를 봐도 순서가 괜찮은가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
AcceptEx()에 recvBuffer 지정시
AcceptEx 문서를 보니, AcceptEx에 버퍼를 지정 시, 해당 버퍼에 기본적으로(sizeof (sockaddr_in) + 16) * 2 만큼의 데이터가 담겨 오는것으로 보입니다. 문서에는 "서버의 로컬 주소 및 클라이언트의 원격 주소" 라고 되어있네요. ProcessAccept에서 따로 해당 크기만큼 버퍼의 OnWrite()를 해주지 않고 있는데,해당 데이터는 현재 Listener에서 따로 처리하지 않으니, 버퍼에는 기록이 되었을지언정사용하는 데이터가 아니니 WritePos를 갱신시켜주지 않는 것으로 이해가 되었습니다. 그런데 만약 FreeSize()가 (sizeof(sockaddr_in) + 16) * 2 보다 작게 남아 있었다면버퍼가 초과되어 정의되지 않은 동작이 일어나거나, 혹은 AcceptEx()가 실패하거나 하는 이상이 있을 것으로 보이는데,본문과 같이 별다른 처리를 하지 않아도 문제가 없는 것인지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 질문입니다
void Createmonster(StatInfo* Info); // 함수 선언부 Createmonster(&monster); // 함수 호출부 void Createmonster(StatInfo* Info) // 함수 내용{ cout << "몬스터 생성" << endl; Info->hp = 40; Info->damage = 8; Info->defence = 2;}Info->hp 가 어떻게 monster.hp에 접근하게 되는지 잘 이해가 안갑니다..해석이 잘 안된다고 해야될지 말로 표현이 잘 안됩니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
초록색 주석문은 뭔가요 .. !
pdf 교안 보면 이런식으로 되어있는 초록색 주석문? 이 있던데그냥 인텔리제이에서는 // 나 /* */ 했을 때 회색으로만 표시되고 저렇게 초록색으로는 안 표시되더라구요 ... 저거는 뭔가요 ?생성 단축키도 알려주시면 감사하겠습니다 ...