묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Verilog FPGA Program 1 (Arty A7-35T)
UART, SPI구현
안녕하세요 강의 잘 보고 있습니다!다름이 아니라 저는 zybo 보드를 사용하고 있기 때문에 PS영역에서 PC와 시리얼 통신을 하고 AXI 통신으로 PL영역에서 data를 보내는 방식으로 사용하고 있습니다.제가 궁금한 것은 uart나 SPI 모듈을 따로 구현을 하면 해당 data를 바로 PL영역으로 보낼 수 있는지 궁금합니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
JdbcTemplate 생성자 만드는데 에러나요. JdbcTemplate 타입의 bean을 찾을 수 없다고 하는데 어떻게 해결해야 하나요?
JdbcTemplate 생성자 만드는데 에러나요. JdbcTemplate 타입의 bean을 찾을 수 없다고 하는데 어떻게 해결해야 하나요?강의를 더 보니까 19강에서 설명해주고 계신 build.gradle 때문인거 같은데요.저는 해당 파일이 비활성화 되어 있는 것 같아요.위 캡쳐처럼 코드가 알록달록(주황, 보라, 노랑..) 하지 않고, 모두 회색으로 보이는데 그래서 일까요?
-
미해결워드프레스(WordPress) 완전정복
프로젝트4-마이그레이션 플러그인이 없어요..
안녕하세요 선생님! 열심히 수강하고 있는데 질문이 있어서요.프로젝트4에서 라이브이전 및 런칭하는 과정에서 보여주신 플러그인(아래 사진첨부드립니다)이 없어서요.작성자분이 내린건지 알수는 없지만, 해당플러그인이 없어서 phpMyAdmin에 대한 진도를 못나가고 있었어요... 프로젝트3에서 보여주신 All-IN-ONE플러그인 방법으로 홈페이지를 운영 및 외주작업을 해도 문제는 없을까요...?
-
미해결
tailwindcss 3.2v
안녕하세요.최근 tailwindcss 3.2 버전이 나와서 어떤 부분이 업데이트 된건지 살펴보는중인데요.이해가 잘 안되는 부분이 있어서 글 남깁니다.아래 사진은 공식 문서에 나와있는 글인데요.별도로 프로젝트 폴더에 config 파일을 만들지 않아도@config "./tailwind.admin.config.js"; 라고 선언하면 손쉽게 사용 가능하다는 의미일까요..?
-
미해결바닥부터 시작하는 STM32 드론 개발의 모든 것
cubeIDE에서 stlink를 인식하지 못합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.갑자기 ST link 인식이 안됩니다. 어떻게 해결해야 할까요 ? locahost 61234 connection time out 에러 메세지가 나옵니다.
-
미해결스프링 핵심 원리 - 기본편
스프링의 도움없이 싱글톤을 구현하면서 di해주는법
"스프링의 도움없이 싱글톤을 구현할 경우엔개방폐쇄원칙과 의존관계역전원칙을 위배하게 됩니다" << 이 말에 대해 궁금한점이 있습니다왜 스프링의 도움없인 싱글톤을 구현하면서 di를 해줄수없는건가요?위 사진과 같은 코드를 자바코드로 작성해주면 되는거아닌가요??..
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
one to many 지연로딩
@Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>();일대다 관계에서는 기본 설정이 지연 로딩이 맞나요 ??orderItems.stream().forEach(o -> o.getItem().getName()); //Lazy 강제초기화@OneToMany 어노테이션에서 fetch = Fetch.Lazy가 없어서 기본설정으로 들어가는지 궁금합니다 !
-
해결됨Slack 클론 코딩[실시간 채팅 with React]
router.js:954 No routes matched location 에러가 발생합니다.
안녕하세요 제로초님, 현재 react-router-dom v6.6.2로 강의를 수강하고 있습니다. 앞부분에서 잘 따라하다가 어느 부분에서 잘못된 것인지 로그인을 했을 때 흰 화면과 함께 아래 첨부한 사진과 같은 에러가 발생하했습니다.API를 받아올 때 사용하는 params에 문제가 있나 싶었지만, http://localhost:3095/api/workspaces/sleact/channels 이 주소로 들어갔을 때 아래와 같은 데이터를 받아오는 것을 확인할 수 있었습니다.[ { "id": 1, "name": "일반", "private": false, "createdAt": "2023-01-26T08:07:33.000Z", "updatedAt": "2023-01-26T08:07:33.000Z", "WorkspaceId": 1, "Members": [ { "id": 2, "ChannelMembers": { "UserId": 2 } } ] } ] 데이터가 문제인가 싶어서 테이블도 삭제했다가 다시 만들어봤지만 해결할 수 없었습니다ㅠㅠ 어떻게 해결할 수 있을까요?? 혹시 몰라 코드는 모두 첨부하겠습니다! // App/index.tsx import React from 'react'; import loadable from '@loadable/component'; import { Routes, Route, Navigate } from 'react-router-dom'; const Login = loadable(() => import('@pages/Login')); const SignUp = loadable(() => import('@pages/SignUp')); const Workspace = loadable(() => import('@layouts/Workspace')); const App = () => { return ( <Routes> <Route path="/" element={<Navigate to="/login" />} /> <Route path="/login" element={<Login />} /> <Route path="/signup" element={<SignUp />} /> <Route path="/workspace/:workspace" element={<Workspace />} /> </Routes> ); }; export default App;// Workspace/index.tsx import React, { useCallback, useEffect, useState } from 'react'; import useSWR from 'swr'; import axios from 'axios'; import fetcher from '@utils/fetcher'; import gravatar from 'gravatar'; import { Navigate, Route, Routes } from 'react-router'; import { AddButton, Channels, Chats, Header, LogOutButton, MenuScroll, ProfileImg, ProfileModal, RightMenu, WorkspaceButton, WorkspaceModal, WorkspaceName, Workspaces, WorkspaceWrapper, } from './styles'; import loadable from '@loadable/component'; import Menu from '@components/Menu'; import { Link } from 'react-router-dom'; import { IChannel, IUser } from '@typings/db'; import Modal from '@components/Modal'; import { Button, Input, Label } from '@pages/SignUp/styles'; import useInput from '@hooks/useInput'; import { toast } from 'react-toastify'; import CreateChannelModal from '@components/CreateChannelModal'; import { useParams } from 'react-router'; const Channel = loadable(() => import('@pages/Channel')); const DirectMessage = loadable(() => import('@pages/DirectMessage')); const Workspace = () => { const [showUserMenu, setShowUserMenu] = useState(false); const [showCreateWorkspaceModal, setShowCreateWorkspaceModal] = useState(false); const [showWorkspaceModal, setShowWorkspaceModal] = useState(false); const [showCreateChannelModal, setShowCreateChannelModal] = useState(false); const [newWorkspace, onChangeNewWorkspace, setNewWorkspace] = useInput(''); const [newUrl, onChangeNewUrl, setNewUrl] = useInput(''); const params = useParams<{ workspace?: string }>(); const { workspace } = params; const { data: userData, error, mutate } = useSWR<IUser | false>('http://localhost:3095/api/users', fetcher); const { data: channelData } = useSWR<IChannel[]>( userData ? `http://localhost:3095/api/workspaces/${workspace}/channels` : null, fetcher, ); const onLogout = useCallback(() => { axios .post('http://localhost:3095/api/users/logout', null, { withCredentials: true, }) .then(() => { mutate(false, false); }); }, []); const onClickUserProfile = useCallback(() => { setShowUserMenu((prev) => !prev); }, []); const onCloseUserProfile = useCallback((e: React.MouseEvent) => { e.stopPropagation(); setShowUserMenu(false); }, []); const onClickCreateWorkspace = useCallback(() => { setShowCreateWorkspaceModal((prev) => !prev); }, []); const onCreateWorkspace = useCallback( (e: React.FormEvent) => { e.preventDefault(); // 필수 값이 들어있는지 검사 if (!newWorkspace || !newWorkspace.trim()) return; if (!newUrl || !newUrl.trim()) return; axios .post( 'http://localhost:3095/api/workspaces', { workspace: newWorkspace, url: newUrl, }, { withCredentials: true }, ) .then(() => { mutate(); setShowCreateWorkspaceModal(false); setNewWorkspace(''); setNewUrl(''); }) .catch((error) => { console.dir(error); toast.error(error.response?.data, { position: 'bottom-center' }); }); }, [newWorkspace, newUrl], ); const onCloseModal = useCallback(() => { setShowCreateWorkspaceModal(false); setShowCreateChannelModal(false); }, []); const onClickAddChannel = useCallback(() => { setShowCreateChannelModal(true); }, []); const toggleWorkspaceModal = useCallback(() => { setShowWorkspaceModal((prev) => !prev); }, []); if (!userData) { return <Navigate to="/login" />; } return ( <div> <Header> <RightMenu> <span onClick={onClickUserProfile}> <ProfileImg src={gravatar.url(userData.email, { s: '28px', d: 'retro' })} alt={userData.email} /> <Menu style={{ right: 0, top: 38 }} show={showUserMenu} onCloseModal={onCloseUserProfile}> <ProfileModal> <img src={gravatar.url(userData.email, { s: '36px', d: 'retro' })} alt={userData.email} /> <div> <span id="profile-name">{userData.nickname}</span> <span id="profile-active">Active</span> </div> </ProfileModal> <LogOutButton onClick={onLogout}>로그아웃</LogOutButton> </Menu> </span> </RightMenu> </Header> <WorkspaceWrapper> <Workspaces> {userData?.Workspaces?.map((ws) => { return ( <Link key={ws.id} to={`${ws.url}/channel/일반`}> <WorkspaceButton>{ws.name.slice(0, 1).toUpperCase()}</WorkspaceButton> </Link> ); })} <AddButton onClick={onClickCreateWorkspace}>+</AddButton>; </Workspaces> <Channels> <WorkspaceName onClick={toggleWorkspaceModal}>Sleact</WorkspaceName> <MenuScroll> <Menu style={{ top: 95, left: 80 }} show={showWorkspaceModal} onCloseModal={toggleWorkspaceModal}> <WorkspaceModal> <h2>Sleact</h2> <button onClick={onClickAddChannel}>채널 만들기</button> <button onClick={onLogout}>로그아웃</button> </WorkspaceModal> </Menu> {channelData?.map((v) => ( <div>{v.name}</div> ))} </MenuScroll> </Channels> <Chats> <Routes> <Route path="/:workspace/channel/:channel" element={<Channel />} /> <Route path="/:workspace/dm/:id" element={<DirectMessage />} /> </Routes> </Chats> </WorkspaceWrapper> <Modal show={showCreateWorkspaceModal} onCloseModal={onCloseModal}> <form onSubmit={onCreateWorkspace}> <Label id="workspace-name"> <span>워크스페이스 이름</span> <Input id="workspace" value={newWorkspace} onChange={onChangeNewWorkspace} /> </Label> <Label id="workspace-label"> <span>워크스페이스 url</span> <Input id="workspace" value={newUrl} onChange={onChangeNewUrl} /> </Label> <Button type="submit">생성하기</Button> </form> </Modal> <CreateChannelModal show={showCreateChannelModal} onCloseModal={onCloseModal} setShowCreateChannelModal={setShowCreateChannelModal} /> </div> ); }; export default Workspace; // CreateChannel/index.tsx import Modal from '@components/Modal'; import useInput from '@hooks/useInput'; import { Button, Input, Label } from '@pages/SignUp/styles'; import { IChannel, IUser } from '@typings/db'; import fetcher from '@utils/fetcher'; import axios from 'axios'; import React, { useCallback } from 'react'; import { useParams } from 'react-router'; import { toast } from 'react-toastify'; import useSWR from 'swr'; interface Props { show: boolean; onCloseModal: () => void; setShowCreateChannelModal: (flag: boolean) => void; } const CreateChannelModal: React.FC<Props> = ({ show, onCloseModal, setShowCreateChannelModal }) => { const [newChannel, onChangeNewChannel, setNewChannel] = useInput(''); const params = useParams<{ workspace?: string }>(); const { workspace } = params; const { data: userData, error, mutate } = useSWR<IUser | false>('http://localhost:3095/api/users', fetcher); const { mutate: mutateChannel } = useSWR<IChannel[]>( userData ? `http://localhost:3095/api/workspaces/${workspace}/channels` : null, fetcher, ); const onCreateChannel = useCallback( (e: React.FormEvent) => { e.preventDefault(); axios .post( `http://localhost:3095/api/workspaces/${workspace}/channels`, { name: newChannel, }, { withCredentials: true }, ) .then(() => { setShowCreateChannelModal(false); mutateChannel(); setNewChannel(''); }) .catch((error) => { console.dir(error); toast.error(error.response?.data, { position: 'bottom-center' }); }); }, [newChannel, workspace], ); return ( <Modal show={show} onCloseModal={onCloseModal}> <form onSubmit={onCreateChannel}> <Label id="channel-label"> <span>채널 이름</span> <Input id="workspace" value={newChannel} onChange={onChangeNewChannel} /> </Label> <Button type="submit">생성하기</Button> </form> </Modal> ); }; export default CreateChannelModal;
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
파라미터에 _ 처리
안녕하세요 강사님! 수업 잘 듣고 있습니다!로그인된 사람만 커뮤니티 생성 페이지 들어갈 수 있게 해 주기 강의에서 09:06 부분에Request 객체를 사용하지 않아 _처리 해주시는데 그렇다면 파라미터를 처음부터 받지 않으면 되는거 아닌가요?강의에서는 (_: Request, res: Response) 이렇게 처리해주셨는데 그냥 (res: Response) 이렇게 작성해도 기능에는 문제가 없을 것 같아 _처리를 해주시는 이유가 궁금합니다.늦었지만 새해 복 많이 받으시고 답변 미리 감사합니다~
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
<select>에 value속성을 만들지 않은 이유
addForm.html의 일부 코드입니다. <select th:field="*{deliveryCode}"> -> 렌더링한 결과: <select id="deliveryCode" name="deliveryCode">렌더링한 결과에 value 속성이 없는데, 타임리프가 <select>에는 value 속성이 필요없다고 판단하여 만들어주지 않은 것인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
<option> value=""인 경우
item.html의 일부 코드입니다. <select th:field="${item.deliveryCode}"> <option value="">==배송 방식 선택==</option> <option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}"></option> </select>select에서 아무 것도 선택하지 않아서 '==배송 방식 선택=='이 선택된 경우, 'deliveryCode='로 서버에 전달됩니다. 그리고 Item 객체의 deliveryCode필드에 ""로 저장됩니다.이때, 소스코드 보기를 하면,'<option value="">==배송 방식 선택==</option>'으로 나옵니다. selected="selected" 속성이 없는 것입니다.th:field, th:value의 값이 같을 때, selected="selected"라는 속성을 추가해줍니다.두 값이 ""로 같은데도 selected 속성이 추가되지 않은 이유가 무엇일까요?th:value가 아닌 그냥 value이기 때문인가 싶어서 value="" -> th:value="${''}"로 작성해보았는데,여전히 소스코드 보기를 하면'<option value="">==배송 방식 선택==</option>'으로, selected 속성 없이 출력됩니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
_app.tsx 에러
_app.tsx 로 바꾸고나서 <Component/>에서 에러가 나는데 어떻게 해야하나요...?
-
미해결스프링 핵심 원리 - 고급편
newProxyInstance의 인자중 ClassLoader 질문
newProxyInstance(ClassLoader, Class<?>[] interfaces, InvocationHandler)newProxyInstance의 인자는 위와 같습니다.본 강의에서는 interfaces 배열에 하나의 interfaces만 들어있습니다. 그리고, interfaces배열에 딱 하나 들어있는 그 인터페이스 클래스에서 getClassLoader()로 클래스로더를 받아와서 이를 newProxyInstance를 호출할때 첫번째 인자로 사용하고 있습니다.Q1. 그렇다면 만약, interfaces에 하나가 아닌 여러개가 있다고 하면 클래스로더는 어디서 받아오나요? 임의의 인터페이스에서 골라서 받아오나요?Q2. 사실 클래스로더는 아무 클래스에서 받아와도 상관없는것이고. 관습적으로 interfaces 배열에 들어있는 임의의 인터페이스에서 받아오는것이다. 이런건가요?질문 읽어주셔서 감사합니다.
-
미해결웹플로우(Webflow) 시작하기 - 코딩 없이 자유도 높은 프로토타입 만들기
Upvote 구현하기 동영상 문제
Upvote 기능 구현 강의를 들으려고 하는데요 "동영상 준비중에 있습니다." 라고만 나오네요?강의가 아직 업로도 안된건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
공부 방법에 대해서 질문이 있습니다
안녕하십니까 게임 프로그래머 취업 가이드 영상을 보고 클라이언트쪽만 공부하다가 서버 공부를 시작하려고 하는 대학교 2학년생입니다.유니티와 언리얼강의 전체를 한번씩 보면서 어떤 느낌인지 파악하고 이해 안되는 강의를 계속 돌려보는 식으로 공부하려고 했습니다. 근데 제가 유니티 c#, 알고리즘, 엔진을 들을때는 괜찮았는데 게임서버 강의를 이제 1번 완강했는데 거의 부분적인 이해만 한것같고 전체의5%정도밖에 이해를 못했습니다.. 이게 다음파트로 넘어가는게 맞을까요? 아니면 이해갈때까지 서버강의를 계속 들어야할까요?조금이라도 이해가 더 될까봐 한빛아카데미 데이터 통신과 컴퓨터 네트워크 박기현 지음 이 이론책을 같이 보면서 공부중인데 이 두꺼운 이론책을 봐도 이 강의와의 접점을 못찾겠고 봐도 이해가 잘 안가는데 보는게 맞을까요? 아니면 시간낭비일까요..?강의 듣는 순서도 고민이 됩니다 유니티 강의보다 c++ 강의와 c++ 서버 강의를 듣고 유니티 강의로 넘어오는게 나을까요 아니면 지금 하는대로 유니티먼저듣고 c++강의로 넘어가는게 맞을까요?중구난방하게 글을 적은 느낌이라 죄송합니다 ㅠㅠ
-
미해결처음 만난 리액트(React)
(실습) Context를 사용하여 테마 변경 기능 만들기 에서 테마 변경이 안 돼요.
테마 변경 버튼을 눌러도 테마 색 변경이 안 됩니다. 이전에 카드 만들기 실습에서도 색이 안 나오는 걸 보면 제 습관적인 실수인데... 제 실수를 못 찾겠습니다...
-
미해결캐글 설문조사로 데이터 분석 입문하기
이중리스트에 대한 질문
선생님 좋은 강의 감사합니다. 복습 중에 궁금한 것이 생겨 다시 질문 하나 드립니다.11강 9:00쯤 아래와 같이 미국의 데이터만 불러오셨는데요. 이때 인자가 하나인데 왜 isin("United States of America") 가 아니라, isin(["United States of America"])처럼 리스트를 또 씌워주는지 궁금합니다. 이전 강의에서 여러 개를 집어넣을 때 리스트를 씌워줘야 한다고 하신 건 기억하는데, 이 경우에는 한 개뿐인데도 씌우는 것이 의아하여 여쭤봅니다.감사합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
혹시 테스트 결제 잘 되나요??
여러 방면으로 시도 중인데,error_code: "NOT_READY"error_msg: "등록된 사용자가 아니거나, 아임포트 관리자 페이지에 설정된 PG정보가 없습니다."해당 에러가 뜨면서 계속 실패하네요;;혹시 하신 분들은 어떻게 성공하셨는지 궁금합니다.일단 제가 예상한 것으로는 강의 화면이랑 제 구 관리자콘솔의 시스템 관리 탭이 다른 점에 눈이 가는데, 이걸 어떻게 처리해야되는지 어디를 찾아봐도 안나오네요...강의에서는 여러 탭이 있는데 저는 두 개의 탭 밖에 보이지 않습니다. 해결 방법을 찾고 싶어도 어디서 찾아야 되는 지 감이 안잡히네요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
order저장 시 OrderStatus.ERROR일 때 Item의 stockQuantity를 감소시키지 않게 하기 질문이요
Order가 저장할 때 OrderStatus.ERROR 일 때는 Order만 db에 저장되고Item의 재고(stockQuantity)는 감소가 안되게 하고 싶습니다.즉, Order는 OrderStatus.ERROR 여부와 상관없이 저장이 되고OrderStatus.ERROR일때만 Item의 재고(stockQuantity)는 감소가 안되게 하고 싶습니다.(ERROR니까 재고가 감소안되게 하려고합니다) 저는 주문(order)하다가 에러가 발생하면 throw로 Exception을 던지지 않고OrderStatus만 ERROR로 변경해 주려고 합니다.즉 ERROR 발생했을때 OrderStatus의 값을 order.setStatus(OrderStatus.ERROR)를 통해 에러를 발생시키지만 주문자체는 db에 저장되고Item의 재고(stockQuantity)를 줄여주지 않으려고합니다.물론 ERROR가 발생하지 않고 정상적으로 실행이 되면 Item의 재고도 정삭적으로 줄어 들겠죠 다음은 Order 엔터티입니다. 강의와 조금 다르게 TimeStapmed를 상속받았는데 질문과는 상관없습니다.@Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor public class Order extends TimeStamped{ @Id @GeneratedValue private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) private Delivery delivery; @Enumerated(EnumType.STRING) private OrderStatus status; private long orderTotalPrice; public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); orderItem.setOrder(this); } public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){ Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems){ order.orderTotalPrice += orderItem.getTotalPrice(); order.addOrderItem(orderItem); } order.setStatus(OrderStatus.CREATED); return order; } } 그래서 제가 해준 방법은 우선 특정 조건일 때 setStatus(OrderStatus.ERROR) 으로 에러를 발생시킵니다. (길어져서 코드에는 안적었는데 디버깅상 전혀 문제가 없습니다. 그냥 특정조건일 때 에러 발생시키는 겁니다.)그리고 Order 엔터티에 있는@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 을@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) 로 수정한다음에OrderService에서 order를 save한 후 OrderStatus.ERROR 일때만 flush를 발동 시켰는데orderRepository.save(order); if (order.getStatus() == OrderStatus.ERROR){ orderRepository.flush(); } orderItem만 저장이 안되고 Item의 stockQuantity는 줄어드는군요그래서 OrderItem에 있는@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; 위 코드에 cascade = CascadeType.DETACH 를 추가해도 소용이 없더군요 어떻게하면order는 OrderStatus의 ERROR 여부와 상관없이 order는 저장이 되고OrderStatus.ERROR 일때만 Item의 stockQuantity가 저장이 안되게 할 수 있을까요? 혹시몰라서 OrderItem과 Item의 코드도 올립니다.OrderItem엔터티의 코드@Entity @Getter @Setter @NoArgsConstructor public class OrderItem { @Id @GeneratedValue @Column(name = "order_item_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; private Integer orderPrice; private Integer quantity; // ... createOrderItem ... // ... getTotalPrice ... } Item엔터티의 코드입니다.@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "dtype") @Getter @NoArgsConstructor @AllArgsConstructor public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private Integer price; private Integer stockQuantity; public Item(String name, Integer price,Integer stockQuantity){ this.name = name; this.price = price; this.stockQuantity = stockQuantity; } public void removeStock(Integer quantity) { Integer restStock = this.stockQuantity - quantity; if(restStock < 0) { throw new EApplicationException(ErrorCode.NOT_ENOUGH_STOCK, String.format("Out of Stock")); } this.stockQuantity = restStock; } } 감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-S 질문드립니다
https://www.acmicpc.net/source/54668095인접행렬로 풀 때 메모리 초과가 나서 변경하였는데 시간초과가 나는 이유를 모르겠습니다.