From c953dcc4345b741a392d1eaf259faf5a679b62db Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 6 Aug 2024 16:55:35 +0900 Subject: [PATCH 01/52] =?UTF-8?q?#10=20Update=20Controller=20:=20Swagger?= =?UTF-8?q?=EC=97=90=20Response=20=EC=98=88=EC=8B=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConsumptionController.java | 41 +++++++++++++++++++ .../controller/HomeController.java | 13 ++++++ .../controller/InterestRateController.java | 33 +++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/src/main/java/com/finut/finut_server/controller/ConsumptionController.java b/src/main/java/com/finut/finut_server/controller/ConsumptionController.java index 279bf1a..b3ae987 100644 --- a/src/main/java/com/finut/finut_server/controller/ConsumptionController.java +++ b/src/main/java/com/finut/finut_server/controller/ConsumptionController.java @@ -2,11 +2,16 @@ import com.finut.finut_server.apiPayload.ApiResponse; +import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.product.Product; import com.finut.finut_server.domain.purchases.Purchases; import com.finut.finut_server.service.ConsumptionService; import com.finut.finut_server.service.PurchasesService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -28,23 +33,59 @@ public ConsumptionController(ConsumptionService consumptionService, PurchasesSer this.purchasesService = purchasesService; } @Operation(summary = "전체 물품 보기", description = "전체 물품을 보기 위한 api 입니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + array = @ArraySchema(schema = @Schema(implementation = Product.class)))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @GetMapping("/products") public ApiResponse> readAllProducts() { return ApiResponse.onSuccess(ConsumptionService.getAllProducts()); } + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + array = @ArraySchema(schema = @Schema(implementation = Product.class)))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @Operation(summary = "물품 상세 정보 보기", description = "각 물품의 상세 정보를 보기 위한 api 입니다") @GetMapping("/products/{productId}") public ApiResponse> readProduct(@PathVariable Long productId) { return ApiResponse.onSuccess(ConsumptionService.getProductInfo(productId)); } + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = Purchases.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @Operation(summary = "물품 구매", description = "물품을 구매하기 위한 api 입니다") @GetMapping("/buy") public ApiResponse buyProduct(@RequestParam Long userId, @RequestParam Long productId) { return ApiResponse.onSuccess(PurchasesService.buyProduct(userId, productId)); } + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + array = @ArraySchema(schema = @Schema(implementation = Product.class)))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @Operation(summary = "내 물품 보기", description = "구매한 물품들을 모두 위한 api 입니다") @GetMapping("/my-purchases") public ApiResponse> readMyPurchases(@RequestParam Long userId) { diff --git a/src/main/java/com/finut/finut_server/controller/HomeController.java b/src/main/java/com/finut/finut_server/controller/HomeController.java index 8b8daf2..de96968 100644 --- a/src/main/java/com/finut/finut_server/controller/HomeController.java +++ b/src/main/java/com/finut/finut_server/controller/HomeController.java @@ -1,10 +1,14 @@ package com.finut.finut_server.controller; import com.finut.finut_server.apiPayload.ApiResponse; +import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.config.auth.dto.SessionUser; import com.finut.finut_server.domain.user.UserResponseDTO; import com.finut.finut_server.service.UsersService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; @@ -34,6 +38,15 @@ public HomeController(HttpSession httpSession) { @Autowired private UsersService userService; + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = UserResponseDTO.loginUserDTO.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @Operation(summary = "로그인 성공", description = "로그인 성공시 해당 api에 리다이렉션 되어 수행됩니다") @GetMapping("/success") @ResponseBody diff --git a/src/main/java/com/finut/finut_server/controller/InterestRateController.java b/src/main/java/com/finut/finut_server/controller/InterestRateController.java index c345362..85d550f 100644 --- a/src/main/java/com/finut/finut_server/controller/InterestRateController.java +++ b/src/main/java/com/finut/finut_server/controller/InterestRateController.java @@ -3,9 +3,15 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.finut.finut_server.apiPayload.ApiResponse; +import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; +import com.finut.finut_server.domain.product.Product; import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.service.InterestRateService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; @@ -19,18 +25,45 @@ public class InterestRateController { @Autowired private InterestRateService interestRateService; + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = String.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @Operation(summary = "오늘의 금리 정보", description = "오늘의 금리 정보를 가져오기 위한 api 입니다.") @GetMapping("/today") public ApiResponse getInterestRatesToday() { return ApiResponse.onSuccess(interestRateService.getInterestRatesToady()); } + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ArrayNode.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @Operation(summary = "3개년 금리 정보", description = "3년의 금리 정보를 가져오기 위한 api 입니다") @GetMapping("/3") public ApiResponse getInterestRates3Y() { return ApiResponse.onSuccess(interestRateService.getInterestRates3Y()); } + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ArrayNode.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @Operation(summary = "5개년 금리 정보", description = "5년의 금리 정보를 가져오기 위한 api 입니다") @GetMapping("/5") public ApiResponse getInterestRates5Y() { From 76d2f47725dbb68a404acae21a0e7d050382f9d6 Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 6 Aug 2024 18:21:26 +0900 Subject: [PATCH 02/52] =?UTF-8?q?#21=20Fix=20Quiz=20:=20=ED=80=B4=EC=A6=88?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 3 ++- .../controller/QuizController.java | 20 ++++++++++--------- .../finut_server/converter/QuizConverter.java | 15 +++++++++----- .../finut/finut_server/domain/quiz/Quiz.java | 3 ++- .../domain/quiz/QuizResponseDTO.java | 6 +----- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java index f2fb0d1..8c1ed55 100644 --- a/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java @@ -24,7 +24,8 @@ public enum ErrorStatus implements BaseErrorCode { ARTICLE_NOT_FOUND(HttpStatus.NOT_FOUND, "ARTICLE4001", "게시글이 없습니다."), // 퀴즈 관련 에러 - INVALID_NUMBER(HttpStatus.BAD_REQUEST, "QUIZ400", "유효하지 않은 값입니다."); + INVALID_NUMBER(HttpStatus.BAD_REQUEST, "QUIZ400", "유효하지 않은 값입니다."), + NULL_DATA(HttpStatus.BAD_REQUEST, "QUIZ401", "데이터가 없습니다."); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 67e9052..c73a1ab 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -14,11 +14,10 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -@Controller -@RequestMapping("/api/quiz") +@RestController +@RequestMapping("/quiz") @Tag(name = "Quiz Controller", description = "퀴즈 관련 api") public class QuizController { @Autowired @@ -26,29 +25,31 @@ public class QuizController { @Operation(summary = "퀴즈 내용 불러오기", description = "퀴즈를 보여줍니다.") @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorReasonDTO.class))) }) - @GetMapping("/") - public ApiResponse getQuiz(@PathVariable(name="userId") Long userId){ + @GetMapping("") + public ApiResponse getQuiz(@RequestParam(name="userId") Long userId){ Quiz quiz = quizService.getQuiz(); return ApiResponse.onSuccess(QuizConverter.toGetQuizDto(userId, quiz)); } @Operation(summary = "퀴즈 데이터 저장", description = "생성된 퀴즈 데이터를 DB에 저장합니다.") @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.saveQuizDto.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "올바른 날짜나 시간이 아닙니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorReasonDTO.class))) }) - @PostMapping("/") + @PostMapping("/save") public ApiResponse saveQuiz(@RequestBody @Valid QuizRequestDTO.saveQuiz request){ Quiz quiz = quizService.saveQuiz(request); return ApiResponse.onSuccess(QuizConverter.toSaveQuizDto(quiz)); @@ -56,7 +57,8 @@ public ApiResponse saveQuiz(@RequestBody @Valid Qui @Operation(summary = "퀴즈 정답 판독 후 돈 적립", description = "사용자가 입력한 답이 정답인지 판독한 후, 정답 여부에 따라 돈을 적립합니다.") @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.updateMoneyDto.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "정답 여부를 전달 받지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", diff --git a/src/main/java/com/finut/finut_server/converter/QuizConverter.java b/src/main/java/com/finut/finut_server/converter/QuizConverter.java index 4e705a9..f75bcaa 100644 --- a/src/main/java/com/finut/finut_server/converter/QuizConverter.java +++ b/src/main/java/com/finut/finut_server/converter/QuizConverter.java @@ -3,6 +3,7 @@ import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.quiz.QuizRequestDTO; import com.finut.finut_server.domain.quiz.QuizResponseDTO; +import org.springframework.security.core.parameters.P; public class QuizConverter { public static QuizResponseDTO.saveQuizDto toSaveQuizDto(Quiz quiz){ @@ -11,6 +12,8 @@ public static QuizResponseDTO.saveQuizDto toSaveQuizDto(Quiz quiz){ .quizContent(quiz.getContent()) .quizAnswer(quiz.getAnswer()) .quizReason(quiz.getReason()) + .correctMoney(quiz.getCorrectMoney()) + .wrongMoney(quiz.getWrongMoney()) .build(); } @@ -25,13 +28,15 @@ public static Quiz toQuiz(QuizRequestDTO.saveQuiz request){ } public static QuizResponseDTO.getQuizDto toGetQuizDto(Long userId, Quiz quiz){ + if(quiz == null) { + return QuizResponseDTO.getQuizDto.builder() + .userId(userId) + .quiz(null) + .build(); + } return QuizResponseDTO.getQuizDto.builder() .userId(userId) - .quizContent(quiz.getContent()) - .quizAnswer(quiz.getAnswer()) - .quizReason(quiz.getReason()) - .correctMoney(quiz.getCorrectMoney()) - .wrongMoney(quiz.getWrongMoney()) + .quiz(quiz) .build(); } diff --git a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java index 6686a92..d8b90a7 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java @@ -19,10 +19,11 @@ public class Quiz extends BaseTimeEntity { @Column(nullable = false) private String content; // 퀴즈 내용 + @Lob @Column(nullable = false) private String answer; // 퀴즈 정답 - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "MEDIUMTEXT") private String reason; // 정답 이유 @Column(nullable = false) diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java index 8cef88b..6ca3a9d 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java @@ -27,11 +27,7 @@ public static class saveQuizDto{ @AllArgsConstructor public static class getQuizDto{ Long userId; // 접속한 유저의 아이디 - String quizContent; // 퀴즈 내용 - String quizAnswer; // 퀴즈 답 - String quizReason; // 답 풀이 - int correctMoney; // 맞춘 경우 얻는 돈 - int wrongMoney; // 틀린 경우 얻는 돈 + Quiz quiz; } @Builder From 4e9f3337dc1240396313c9c31f57558fee9215ef Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 6 Aug 2024 18:21:49 +0900 Subject: [PATCH 03/52] =?UTF-8?q?#21=20Fix=20Config=20:=20post=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20csr?= =?UTF-8?q?f=20=EC=84=A4=EC=A0=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/finut/finut_server/config/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/finut/finut_server/config/SecurityConfig.java b/src/main/java/com/finut/finut_server/config/SecurityConfig.java index cf00e8d..8ebd7f5 100644 --- a/src/main/java/com/finut/finut_server/config/SecurityConfig.java +++ b/src/main/java/com/finut/finut_server/config/SecurityConfig.java @@ -8,6 +8,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; @@ -44,7 +45,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, CustomOAuth2Us logout .logoutSuccessUrl("/") // 임시 ) - .csrf(csrf -> csrf.ignoringRequestMatchers("/h2-console/**")) + .csrf(AbstractHttpConfigurer::disable) // post 요청을 위한 csrf disable .headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin())); return http.build(); } From dc764de88368eb56a823771319b756e3f7528eb7 Mon Sep 17 00:00:00 2001 From: plum-king Date: Fri, 16 Aug 2024 10:20:55 +0900 Subject: [PATCH 04/52] =?UTF-8?q?#21=20Fix=20Quiz=20:=20quiz=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20entity=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=80=B4?= =?UTF-8?q?=EC=A6=88=20=EC=A0=80=EC=9E=A5=20API=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuizController.java | 16 --------------- .../finut_server/converter/QuizConverter.java | 20 ------------------- .../finut/finut_server/domain/quiz/Quiz.java | 18 ++++++++++++++--- .../domain/quiz/QuizRequestDTO.java | 13 ------------ .../domain/quiz/QuizResponseDTO.java | 13 ------------ .../finut_server/service/QuizService.java | 12 ----------- 6 files changed, 15 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index c73a1ab..e3298de 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -39,22 +39,6 @@ public ApiResponse getQuiz(@RequestParam(name="userI return ApiResponse.onSuccess(QuizConverter.toGetQuizDto(userId, quiz)); } - @Operation(summary = "퀴즈 데이터 저장", description = "생성된 퀴즈 데이터를 DB에 저장합니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.saveQuizDto.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "올바른 날짜나 시간이 아닙니다.", - content = @Content), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", - content = @Content(mediaType = "application/json", - schema = @Schema(implementation = ErrorReasonDTO.class))) - }) - @PostMapping("/save") - public ApiResponse saveQuiz(@RequestBody @Valid QuizRequestDTO.saveQuiz request){ - Quiz quiz = quizService.saveQuiz(request); - return ApiResponse.onSuccess(QuizConverter.toSaveQuizDto(quiz)); - } - @Operation(summary = "퀴즈 정답 판독 후 돈 적립", description = "사용자가 입력한 답이 정답인지 판독한 후, 정답 여부에 따라 돈을 적립합니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", diff --git a/src/main/java/com/finut/finut_server/converter/QuizConverter.java b/src/main/java/com/finut/finut_server/converter/QuizConverter.java index f75bcaa..1dbdcf6 100644 --- a/src/main/java/com/finut/finut_server/converter/QuizConverter.java +++ b/src/main/java/com/finut/finut_server/converter/QuizConverter.java @@ -6,26 +6,6 @@ import org.springframework.security.core.parameters.P; public class QuizConverter { - public static QuizResponseDTO.saveQuizDto toSaveQuizDto(Quiz quiz){ - return QuizResponseDTO.saveQuizDto.builder() - .quizId(quiz.getId()) - .quizContent(quiz.getContent()) - .quizAnswer(quiz.getAnswer()) - .quizReason(quiz.getReason()) - .correctMoney(quiz.getCorrectMoney()) - .wrongMoney(quiz.getWrongMoney()) - .build(); - } - - public static Quiz toQuiz(QuizRequestDTO.saveQuiz request){ - return com.finut.finut_server.domain.quiz.Quiz.builder() - .content(request.getContent()) - .answer(request.getAnswer()) - .reason(request.getReason()) - .correctMoney(request.getCorrectMoney()) - .wrongMoney(request.getWrongMoney()) - .build(); - } public static QuizResponseDTO.getQuizDto toGetQuizDto(Long userId, Quiz quiz){ if(quiz == null) { diff --git a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java index d8b90a7..c1641e1 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java @@ -17,14 +17,26 @@ public class Quiz extends BaseTimeEntity { private Long id; @Column(nullable = false) - private String content; // 퀴즈 내용 + private String question; // 퀴즈 내용 @Lob + private String option1; + + @Lob + private String option2; + + @Lob + private String option3; + @Column(nullable = false) - private String answer; // 퀴즈 정답 + @Lob + private String answer; @Column(nullable = false, columnDefinition = "MEDIUMTEXT") - private String reason; // 정답 이유 + private String description; // 정답 설명 + + @Column(nullable = false) + private String quizType; // 퀴즈 타입: TF or 객관식 @Column(nullable = false) private int correctMoney; // 맞춘 경우 얻는 돈 diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java index 24be21e..b8f5d30 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java @@ -9,19 +9,6 @@ @Setter @Builder public class QuizRequestDTO { - @Getter - public static class saveQuiz{ - @NotNull - String content; - @NotNull - String answer; - @NotNull - String reason; - @NotNull - int correctMoney; // 맞춘 경우 얻는 돈 - @NotNull - int wrongMoney; // 틀린 경우 얻는 돈 - } @Getter public static class updateMoney{ diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java index 6ca3a9d..94af1c2 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java @@ -8,19 +8,6 @@ import java.util.List; public class QuizResponseDTO { - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class saveQuizDto{ - Long quizId; - String quizContent; // 퀴즈 내용 - String quizAnswer; // 퀴즈 답 - String quizReason; // 답 풀이 - int correctMoney; // 맞춘 경우 얻는 돈 - int wrongMoney; // 틀린 경우 얻는 돈 - } - @Builder @Getter @NoArgsConstructor diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index 83c1ea0..b38d3bb 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -24,18 +24,6 @@ public class QuizService { @Autowired private QuizRepository quizRepository; - @Transactional - public Quiz saveQuiz(QuizRequestDTO.saveQuiz request){ - if(request.getCorrectMoney() < 0 || request.getWrongMoney() < 0){ - throw new GeneralException(ErrorStatus.INVALID_NUMBER); - } - - Quiz quiz = QuizConverter.toQuiz(request); - quiz = quizRepository.save(quiz); - - return quiz; - } - @Transactional public Quiz getQuiz(){ LocalDate today = LocalDate.now(); From 2c3b0ffc1aa588a0df733c1edb731545357c3ee2 Mon Sep 17 00:00:00 2001 From: plum-king Date: Thu, 22 Aug 2024 23:03:20 +0900 Subject: [PATCH 05/52] =?UTF-8?q?#21=20Fix=20Quiz=20:=20quiz=20entity=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/finut/finut_server/domain/quiz/Quiz.java | 6 +++++- .../java/com/finut/finut_server/domain/quiz/QuizType.java | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/finut/finut_server/domain/quiz/QuizType.java diff --git a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java index c1641e1..eccde93 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java @@ -20,6 +20,7 @@ public class Quiz extends BaseTimeEntity { private String question; // 퀴즈 내용 @Lob + @Column(nullable = false) private String option1; @Lob @@ -35,8 +36,11 @@ public class Quiz extends BaseTimeEntity { @Column(nullable = false, columnDefinition = "MEDIUMTEXT") private String description; // 정답 설명 + @Enumerated(EnumType.STRING) + private QuizType quizType; // 퀴즈 타입: TF or MUL + @Column(nullable = false) - private String quizType; // 퀴즈 타입: TF or 객관식 + private int displayed; // 출제된지 여부 판단 (1: 출제된 적 있음, 0: 출제된 적 없음) @Column(nullable = false) private int correctMoney; // 맞춘 경우 얻는 돈 diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizType.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizType.java new file mode 100644 index 0000000..3a5a66a --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizType.java @@ -0,0 +1,6 @@ +package com.finut.finut_server.domain.quiz; + +public enum QuizType { + TF, // OX + MUL // 삼지선다 +} From 7778e0377c48a49d675787e5229d5ad01df77649 Mon Sep 17 00:00:00 2001 From: Jisoo Hwang Date: Fri, 23 Aug 2024 23:42:19 +0900 Subject: [PATCH 06/52] =?UTF-8?q?#21=20docs:=20quiz.sql=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quiz.sql | 584 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 584 insertions(+) create mode 100644 quiz.sql diff --git a/quiz.sql b/quiz.sql new file mode 100644 index 0000000..152f66c --- /dev/null +++ b/quiz.sql @@ -0,0 +1,584 @@ +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (1, "1금융권은 정부에서 만들어진 ‘상호신용금고법’으로부터 나타난 금융회사가 아니라는 것이다.", "TRUE", "FALSE", "", "TRUE", "은행 외에는 고금리의 사금융밖에 선택지가 없던 1970 년대, 정부에서 ‘상호신용금고법’을 만들어 사금융을 양성화하기 시작했습니다. 이때부터 나타난 회사들은 특정 그룹이나 분야에 전문성을 가진 회사였습니다. 이렇게 새로운 금융회사들이 만들어지던 시기에, 은행과 은행이 아닌 금융회사를 구별해서 부르기 시작했습니다. 예전부터 있었던 은행을 1 금융권으로, ‘은행이 아닌’ 금융회사를 2금융권으로 부르게 된 거죠. 1금융권인 은행과 2금융권에 속해있는 저축은행의 경우, 예금과 대출을 해준다는 측면에서 비슷한 기능을 하기 때문에 소비자 입장에서는 같은 선상에 두고 비교해볼 만합니다.안정성이 높지만 수익률(이자율)이 낮은 1금융권 예금을 택할지, 대출금리가 높지만 대출받기가 더 쉬운 2금융권 대출을 택할지 비교해보는 거예요.", +"TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (2, "2차전지는 충전과 방전을 통해 사용이 가능한 전지가 아니에요.", "TRUE", "FALSE", "", "FALSE", "2차전지는 충전과 방전을 통해 여러 번 사용이 가능한 전지예요. 대표적인 2 차전지로는 휴대폰 배터리가 있습니다. 종류는 납 축전지, 니켈카드뮴 전지, 니켈수소 전지, 리튬이온 전지 등이 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (3, "52주 신고가는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가입니다.", "TRUE", "FALSE", "", "TRUE", "52주 신고가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 높은 +주가를 말해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (4, "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말합니다.", +"TRUE", "FALSE", "", "TRUE", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (5, "bp(베이시스포인트)는 0.01%p의 움직임도 금융시장에 큰 영향을 미칩니다.", "TRUE", "FALSE", "", "TRUE", "기준금리 뉴스에 자주 등장하는 ‘bp’는 ‘basis point’의 약자예요. 금융에서 쓰이는 기본단위로, 금리나 수익률, 환율을 나타낼 때 사용합니다. 일반적으로 사용하는 백분율이 아닌 ‘만분율’ 단위의 움직임을 표현하는데요. 1bp는 0.01%p, 10bp는 0.1%p, 100bp는 1%p예요. 금융시장에서는 0.01%p의 움직임도 영향력이 커요. 그래서 0.01%p도 뉴스에 자주 언급됩니다. 백분율을 기준으로 ‘퍼센트포인트’라고 말하는 것보다 만분율을 기준으로 bp로 나타내는 것이 정보전달에 더 효율적이라서 사용한다는 얘기가 있어요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (6, "DSR은 내 소득 대비 금융부채 원리금 상환비율로, 40%를 넘는 경우에는 대출을 해주지 않는다.", "TRUE", "FALSE", "", "TRUE", "DSR(Debt Service Ratio)은 내 소득 대비 금융부채 원리금 상환비율이에요. DSR 40%라면 내 연 소득이 1억 원일 때, 1년 동안의 원금과 이자 상환비율이 4천만 원을 넘지 않는 정도까지 대출을 해준다는 뜻이에요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (7, "DTI(총부채상환비율)는 연 소득 대비 금융비용 부담률을 나타내는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. DTI는 ‘나의 연소 득’에서 ‘주택담보대출의 원금 상환과 이자, 다른 대출의 이자로 나가는 금액’이 차지하는 비중으로 구합니다. 내가 가진 모든 대출의 원리금 상환금액을 합쳐 따지는 DSR보다는 유한 기준입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (8, "ESG는 환경, 사회, CORPORATE GOVERNANCE에 대한 고려를 의미합니다.", "TRUE", "FALSE", "", "TRUE", "ESG는 Environmental(환경), Social(사회), Governance(지배구조)의 첫 글자를 조합한 단어로 기업의 친환경 경영, 사회적 책임, 투명한 지배구조 등을 의미합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) + +values (9, "ETF는 특정 주식에 대한 투자 상품이 아니다.", "TRUE", "FALSE", "", "TRUE", "ETF(Exchange Traded Fund)는 말 그대로 인덱스펀드를 거래소에 상장시켜 투자자들이 주식처럼 편리하게 거래할 수 있도록 만든 상품입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (10, "G7은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최하는 7개국을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "G7. Group of Seven Summit. 주요 7개국 정상회담의 약자입니다. 미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본 7개국은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최해요. 이 회담뿐만 아니라 이 회담에 참여하는 7개국을 G7이라고 줄여 부르기도 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (11, "GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 것이다.", "TRUE", "FALSE", "", "TRUE", "GNI는 Gross National Income의 약자로, ‘ 국민총소득’입니다. GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 거예요. 우리나라에 거주하고 있는 외국인의 소득은 제외하고, 외국에 거주하는 우리나라 국민의 소득을 포함해요. GNI를 구하는 가장 큰 이유는 국가가 아니라 국민들의 생활 수준을 알아보기 위해서예요. GNI와 유사한 지표로는 GDP가 있어요. GDP는 ‘한 국가에서 생산된 모든 부가가치의 총합’으로 국가 경제의 규모를 나타내죠. 위의 그림으로 이해하자면 사과는 부가가치, 사과박스는 국가의 영토, 과수원은 부가가치를 창출하는 국민ᆞ회사를 뜻해요. A국적을 가진 국민ᆞ회사(과수원)가 전 세계에서 부가가치(사과)를 창출하는 상황을 가정해볼게요. GDP는 사과 박스에 사과가 얼마나 들었는지를 보는 것과 비슷합니다. 사과가 많이 든 박스가 경제력이 큰 국가라고 볼 수 있고요. GNI는 과수원에서 나오는 사과들의 총합이라고 볼 수 있어요. 생산량이 많은 과수원이 GNI가 큰 국가예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (12, "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 방식으로 진행되는 것이다.", "TRUE", "FALSE", "", "TRUE", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 비율을 말해요. 이 수치가 +높은 나라일수록 전 세계 자원이 거쳐가는 글로벌 생산기지라 할 수 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (13, "LTV는 주택담보대출의 대출가능금액을 산출할 때 사용되는 공식입니다.", "TRUE", "FALSE", "", "TRUE", "LTV는 주택담보대출비율(Loan to Value ratio)입니다. 공식은 ‘(대출한 금액) / (아파트 가치)*100’이에요. 즉, 총 아파트 가치에 비교한 대출금의 비중을 보여줘요. LTV는 주택담보대출의 대출가능금액을 산출할 때 사용돼요. LTV 기준비율은 지역에 따라 다른데요. 평균 40~70% 수준입니다. DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. LTV로는 대출받을 수 있는 최대금액을 계산하면 되고, DTI로는 대출 받고자 하는 금액이 소득 수준과 비교해서 적합한지 확인할 수 있습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (14, "M&A(인수합병)는 기업이 다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념입니다.", "TRUE", "FALSE", "", "TRUE", "기업이 +다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념이에요. M&A는 ‘Merger(합병)&Accquisition(인수)’의 약자로, 인수&합병 순서가 반대예요. 인수와 합병 안에서도 어디까지 인수하고, 어떻게 합병하느냐에 따라 세부적인 종류가 나뉩니다. 기본적인 목적은 회사 규모를 키우거나 시장에서 빠르게 경쟁력을 키우는 것이에요. 예를 들어 더 작은 회사의 기술이 지속적으로 필요할 때, 비슷한 업계에서 비슷한 일을 하고 있는 몇 개의 회사가 합쳐져 큰 회사가 되려고 할 때 M&A를 할 수 있습니다. 이 과정이 기존 경영진이나 기존 주주들의 합의에 의해 이뤄지면 우호적 M&A, 기존 경영진이나 주주의 의사와는 관계없이 경영 환경 등에 의해 이뤄지면 적대적 M&A라고 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (15, "PMI ‘ISM 제조업 구매관리자지수’는 생산 관련 지수가 아니고, 경제동향지표입니다.", "TRUE", "FALSE", "", "TRUE", "‘ISM 제조업 구매관리자지수(The ISM manufacturing Index)’ 는 생산 관련 지수예요. ‘PMI 지수’라고도 불러요. PMI 지수는 미국의 민간 경제단체인 공급관리협회 (The Institute of Supply Management)에서 매달 19종 400개 이상의 전·후방 제조업 + +구매담당자에게 설문을 돌려 만드는 경기동향지표입니다. 제조업 실무자에게 재고 수준이나 신규 주문량, 고용 상황 등은 어떻게 되어가고 있는지 등 현재 업황을 물어보기 때문에 업계 전망을 직접적으로 +파악할 수 있어요. 우리나라로 치면 한국은행이 조사하는 ‘기업경기실사지수(BSI)’와 비슷해요. PMI 지수는 매월 첫 영업일에 발표됩니다. 다른 거시경제 지표보다 일찍 발표되면서도 이후 발표될 거시경제 지표와 큰 차이가 날 리는 없으니, 이번 달 경기 움직임을 미리 보여주는 지표라고 할 수 있어요. PMI 지수는 0부터 100 사이에서 수치가 결정됩니다. 50을 기준으로 해서 50보다 낮으면 제조업경기가 전보다 수축되었다고 볼 수 있고, 50보다 높으면 제조업경기가 전보다 확장되어 간다고 해석해요. 절대적으로 좋다, 나쁘다라고 해석하기보다는 ‘전월 대비 이번 달은 어떤지’에 대한 추세가 중요한 지표입니다. 만약 PMI 지수가 좋게 나오면 미국 증시뿐만 아니라 우리나라 증시도 분위기가 좋아질 수 있습니다. 미국의 제조업 업황이 좋으면 우리나라의 수출도 늘어나기 때문이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (16, "가처분소득은 내가 번 소득에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다.", "TRUE", "FALSE", "", "TRUE", "가처분소득은 내가 번 소득 중 소비와 저축으로 쓸 수 있는 돈을 뜻해요. 구체적으로는 내가 번 돈에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다. 소득 분위에 따라 실제로 사람들의 소득수준이 어떤지 볼 수 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (17, "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다.", "TRUE", "FALSE", "", "TRUE", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다. 감사보고서 의견은 ‘적정’, ‘부적정’, ‘한정’, ‘의견거절’ 총 네 가지예요. 이 중 ‘적정’을 제외한 ‘부적정’, ‘한정’, ‘의견거절’은 ‘비적정’에 해당돼요. 코스닥 상장기업이 ‘비적정(부적정, 한정, 의견거절)’ 의견을 받으면 바로 상장폐지 사유가 발생합니다. 코스피 상장사의 경우 ‘부적정’ 또는 ‘의견거절’을 받거나 ‘한정’을 2년 연속 받으면 상장폐지 사유가 발생합니다. 감사보고서 제출 기한을 앞두고 기업도, +주주도 예민해지곤 합니다. 상장폐지 사유가 발생하면, 그 사유가 해소될 때까지 주식 거래가 정지되거든요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (18, "개인소비지출(PCE)은 개인이 소유한 재산을 사용하여 구입하는 모든 물품과 서비스를 의미합니다.", "TRUE", "FALSE", "", "TRUE", "개인소비지출(Personal Consumption Expenditures, PCE)은 가계가 재화와 서비스를 구매하는 데 사용하는 지출을 의미합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (19, "거래대금은 주식이 사고 팔린 총 금액으로, 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "거래대금은 주식이 사고 팔린 총 금액입니다. 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다. 거래대금이 크다는 것은 그만큼 거래량이 많다는 뜻이에요. 거래량과 거래대금은 주가지수와 함께 주식시장의 경기를 판단하는 중요한 자료로 활용되고 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (20, "경기순환사이클은 상승과 하락을 반복하는 현상을 의미하며, 크게 회복기-활황기- 후퇴기-침체기가 있다.", "TRUE", "FALSE", "", "TRUE", "경기가 일정 주기를 두고 상승과 하락을 반복하는 현상을 경기순환이라고 합니다. 크게, 회복기-활황기-후퇴기-침체기가 돌고 돌아요. 경기순환의 전반적인 흐름을 파악하면 투자 전략을 짜는 데 도움이 될 수 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (21, "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동·자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부입니다.", "TRUE", "FALSE", "", "TRUE", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동· 자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부라고 할 수 있어요. 경상수지는 ‘국제수지’라는 지표의 일부분입니다. 국제수지는 우리나라가 다른 국가들과 서로 거래한 내역을 기록한 회계장부라고 생각하시면 돼요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) + +values (22, "경착륙은 호황이 끝나고 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다.", "TRUE", "FALSE", "", "TRUE", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 주식, 부동산 +등 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 자본주의 경제 시스템에서는 호황과 불황이 주기적으로 찾아옵니다. 불황이 왔을 때 부작용을 최소화하며 경기 침체에 대응한다면 연착륙이라고 하고, 대응에 실패해 우당탕 급락과 폭락을 하게 된다면 경착륙이라고 해요. 경착륙은 원래 항공용어로, 비행기 구조가 손상될 정도로 거칠게 착륙하는 행위를 말해요. 연착륙은 서서히 속도를 조절해가며 활주로에 기체가 부드럽게 내려앉는 것입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (23, "공개매수가 특히 적대적 M&A의 방법으로 자주 활용되는 이유는?", "TRUE", +"FALSE", "", "TRUE", "공개적으로 주식을 사들인다는 뜻이에요. 공개매수는 특히 적대적 M&A( 인수합병)의 방법으로 자주 활용됩니다. 회사의 대주주가 지분을 넘기려고 하지 않을 때, 그 회사를 인수하려는 곳에서 다른 주주의 지분을 공개매수를 통해 사들이는 방식이죠. 그렇게 해서 얻은 지분이 기존 대주주보다 많다면 사실상 회사의 경영권을 손에 얻게 되니까요. 공개매수는 일정 기간을 잡아놓고, +그 기간 안에 시장 밖에서 주식을 사는 방식으로 이루어집니다. 이때, 시장에서 거래되는 주식 가격보다 높은 가격을 불러요. 기존 주주는 물론, 지분을 더 확보하려는 대주주가 주식을 더 사도록 만들기도 해서, 공개매수 공시가 나오면 주가가 상승하는 모습을 보이곤 합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (24, "공제는 특정 금액을 덜어준다.", "TRUE", "FALSE", "", "TRUE", "공제(控除). 당길(공), 덜다(제). 사전적 의미로는 ‘뺀다’라는 뜻입니다. 세금 얘기할 때 등장하면 ‘특정 금액을 덜어준다’라고 해석하면 돼요. 회사에서 급여를 줄 때, 4대보험과 소득세를 공제한 금액을 입금합니다. 직원의 4대보험료와 소득세를 나라에 대신 내주거든요. 이렇게 세금을 걷는 방식을 원천징수라고 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (25, "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태는 관치금융입니다.", "TRUE", "FALSE", "", "TRUE", "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태예요. 금융이 법이나 시장 원리보다는 정책에 영향을 받아 움직이게 됩니다. 관치금융은 우리나라 금융시장의 특징이기도 합니다. 1990년대 이전 고도성장기에는 금융이 ‘국민 경제 성장’이라는 정치적인 목적을 위해 움직였어요. 당시 수출대기업에 금융지원을 몰아주는 정책은 강력한 성장 엔진이 되기도 했어요. 지금의 관치금융은 ‘금융만은 국가가 안전하게 보호해야 한다’와 ‘정부의 관리가 금융권의 자생력과 혁신을 가로막고 있다’는 이야기를 동시에 듣고 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (26, "국내총생산(GDP)은 경제 활동의 총 가치를 나타내는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "한 나라의 영역 내에서 가계, 기업, 정부 등 모든 경제주체가 일정기간 +동안 생산한 재화 및 서비스의 부가가치1)를 시장가격으로 평가하여 합산한 것으로 여기에는 +비거주자가 제공한 노동, 자본 등 생산요소에 의하여 창출된 것도 포함되어 있습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (27, "기업이 생산량을 늘리면서 제품 하나를 만드는 데 드는 단위당 생산 비용이 하락하는 것은 규모의 경제입니다.", "TRUE", "FALSE", "", "TRUE", "규모의 경제는 기업이 생산량을 늘리면서 제품 하나를 만드는 데 드는 단위당 생산 비용이 하락하는 현상이에요. 1천만 원을 들여 마스크 공장을 세웠을 때, 마스크를 딱 하나만 찍어내면 마스크 하나를 찍어내는 데 드는 비용은 1천만 원이에요. 하지만 고객의 주문이 늘어나 마스크를 1천 개 찍어내면 마스크 한 개당 생산 비용은 1만 원이 됩니다. 이렇게 고정비용이 줄어드는 규모의 경제가 실현되면 장기적으로 생산 비용이 줄어들어서 수익이 증가하게 돼요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (28, "규제 샌드박스는 업계에서 새로운 금융 서비스나 제품을 시험 배포하기 위해 일정 기간 동안 규제를 완화하는 제도를 말해요.", "TRUE", "FALSE", "", "TRUE", "규제 샌드박스는 새로운 제품이나 서비스를 출시할 때 일정 기간 규제를 면제하거나 유예하는 제도예요. 혁신적인 서비스를 개발할 수 있다면 일단 제약 없이 해보라는 거예요. 샌드박스라는 의미는 모래놀이터(Sandbox)에서 유래되었어요. 모래놀이터에서 아이들이 덜 다치고 안전하게 노는 것 처럼 규제 샌드박스에서는 마음껏 + +아이디어를 펼쳐보라는 의미죠.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (29, "그린워싱은 기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 표방하는 것처럼 홍보하는 것을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "그린 워싱은 ‘Green’과 ‘White Washing’을 합친 말로, 기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 +표방하는 것처럼 홍보하는 걸 의미합니다. 한마디로 친환경인 것처럼 세탁한다는 뜻이에요. 매출, 영업이익과 같은 재무정보와 달리, ESG 등 비재무정보는 평가 기준을 마련하기가 쉽지 않은데요. +빈틈을 이용해 ‘마치 ESG 성과를 잘 내는 것처럼’ 보이도록 그린 워싱을 하는 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (30, "근원소비자물가지수는 소비자들이 실제로 구매하는 물건의 가격을 측정합니다.", "TRUE", "FALSE", "", "TRUE", "소비자물가를 포함한 물가지수에는 ‘명목지수’와 ‘근원지수’ 두 종류가 있습니다. 소비자물가 명목지수는 흔히 ‘소비자물가지수’라고 불려요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (31, "금리인하요구권은 저축자 또는 채무자가 금리를 낮출 수 있도록 요구하는 권리가 있는 경우를 말합니다.", "TRUE", "FALSE", "", "TRUE", "금리인하요구권은 말 그대로 ‘(대출)금리를 내려달라고 요구할 수 있는 권한’이에요.\n신용상태나 상환능력이 대출 당시보다 크게 좋아졌을 때 금리인하요구권을 행사해 대출금리를 낮출 수 있습니다. 구체적인 사유로는 신용등급 상승, 취업, 이직, +승진하거나 전문직 자격증을 땄을 때, 자산이 늘고 부채가 줄었을 때 등이 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (32, "금산분리는 금융과 산업을 결탁하지 못하게 하는 원칙입니다.", "TRUE", "FALSE", "", "TRUE", "금산분리는 금융과 산업을 분리한다는 원칙이에요. 일반 기업이 은행을 또는 은행이 비금융 기업을 일정 수준 이상 소유하지 못한다는 내용인데요. 금융과 산업이 결탁될 때 나타나는 불공정 경쟁 등 문제점을 막기 위한 조치입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (33, "금융통화위원회(금통위)는 1년에 몇회 개최해 통화정책과 금융안정 등에 대해 논의합니다.", "TRUE", "FALSE", "", "TRUE", "금융통화위원회(금통위)는 1년에 24회 개최해 통화정책과 금융안정 등에 대해 논의합니다. 이 중 기준금리 등 통화정책을 결정하는 ‘통화정책방향 결정회의’는 8회 개최하고, 금융안정회의는 4회 개최합니다. 금통위는 한국은행 총재 및 부총재를 포함하여 총 7명의 위원으로 구성되어 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (34, "기간산업은 국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "기간산업(key industry)은 기초산업(Basic industry)이라고도 합니다. 국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 기간산업이라고 부릅니다. 기간산업은 제1차 세계대전 당시 독일이 영국을 상대로 수출을 제한하자 각종 공산품이 모자라 어려움에 빠졌던 영국에서 처음 사용된 용어예요. 오늘날은 경제의 토대가 되는 기초 산업을 의미하기도 해요. 항공이나 완성차, 조선처럼 필수 물류와 관련되거나 통신 및 에너지처럼 다른 산업을 운영할 때 없어서는 안 +되는 산업도 기간산업이에요. 우리나라의 반도체처럼 국가 경제에서 중요한 역할을 하는 산업도 기간산업입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (35, "기업결합은 서로 다른 기업이 하나로 합치는 것을 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "흔히 M&A, 인수합병이라고 부르는 건 기업결합의 한 종류입니다. 기업결합은 서로 다른 기업이 하나로 합치는 것을 뜻하는데, 인수합병 말고도 다양한 방식이 있어요. M&A는 Mergers(합병) and Acquisition(인수)의 약자예요. 순서가 거꾸로 돼 있긴 하지만 ‘인수합병’과 같은 뜻이에요. 인수합병에서 인수는 다른 기업의 경영권을 넘겨받는 것을 뜻합니다. 경영권을 넘겨준 기업에서는 매각했다고 표현해요. 합병은 둘 이상의 기업이 하나의 기업으로 합쳐지는 것을 뜻합니다. 공정거래위원회(공정위)는 시장 독점이 나타나거나, 지배적 사업자가 시장 경쟁을 제한하는 걸 막기 위해 기업결합 심사를 진행합니다. 매출액, 자산, 점유율 등 일정 기준을 넘어서는 기업결합이 심사 대상이에요. 공정위는 기업결합 이후에 시장점유율이 어떻게 바뀔지를 기준으로 평가하는데요. 시장 경쟁이 크게 제한되지 않을 전망이면 승인하지만, 시장 경쟁이 제한되는 상황이라면 불허 또는 조건부 + +승인 결정을 내리게 됩니다. 공정위가 불허를 내린 예시가 있습니다. 지난 2016년, SK텔레콤이 CJ 헬로비전을 인수하려 했을 때예요. 이동통신 시장에서 독과점 우려가 있었기 때문인데요. 결국 두 기업의 인수합병은 불발됐습니다. 조건부 승인 결정을 내린 경우도 있는데요. 딜리버리히어로와 우아한형제들 간의 기업결합이에요. 기업결합 심사 당시, 딜리버리히어로는 ‘요기요’와 ‘배달통’을 소유한 상태였어요. 우아한형제들까지 인수하면 배달업계의 시장점유율 약 90%를 차지해 독과점 사업자가 될 수 있었습니다. 이걸 막기 위해 요기요를 매각한 뒤 우아한형제들을 인수하라는 조건을 건 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (36, "기저효과는 경제지표를 평가할 때 임의로 정한 기준시점 때문에 결과가 왜곡되는 현상을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "경제지표를 평가할 때 임의로 정한 기준시점 +때문에 결과가 왜곡되는 현상이에요. 전년 대비 물가 상승률을 예로 들어 보겠습니다. 2020년과 대비했을 때, 2021년 연간 물가 상승률이 10%, 2021년 대비 2022년의 연간 물가 상승률은 2%라고 가정할게요. 2022년 전년 대비 연간 물가 상승률만 얘기했을 때는 2%로, 상당히 낮은 수치입니다. 하지만 사람들은 살림살이가 굉장히 팍팍하다고 생각할 거예요. 왜냐면 2020년을 기준으로 2022년 물가 상승률을 계산하면 고작 2년 만에 물가가 12.2%나 올랐으니까요. 이때 2022년 전년 대비 연간 물가 상승률 2%를 두고 기저효과가 적용됐다고 합니다. 이미 오를 만큼 올라서 더 크게 오르지는 않는다는 뜻이에요. 이런 기저효과는 지표를 축소해 나타내기도 하지만, 부풀려서 나타내기도 합니다. 경제지표를 읽을 때는 기저효과를 항상 염두에 둬야 해요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (37, "기준금리가 경제시장의 주기적이고 중요한 지표입니다.", "TRUE", "FALSE", "", "TRUE", "금리는 돈을 빌려줄 때, 미래에 더해질 가치를 계산해서 이자를 붙이는 것입니다.\n문제는 정확한 기준이 없다는 거예요. 물건이나 서비스마다 시간에 따라 비싸지는 정도가 다르니까요. 그래서 정부가 기준으로 내놓는 것이 기준금리입니다. +\n우리나라의 기준금리는 한국은행 금융통화위원회가 이런저런 경제지표를 참고해서 결정해요. \n기준금리를 올리면 ‘콜금리’라는 금리는 즉시 올라가게 됩니다. 콜금리는 은행, 증권사, 보험사와 같은 금융기관들이 ‘서로’ 돈을 빌릴 때 적용되는 금리예요. +\n콜금리가 상승하면 은행이 돈을 굴리며 금융시장을 끌어가는 데 비용이 더욱 들기 때문에 다른 금리도 전반적으로 오르게 되어 있어요. 기준금리가 콜금리를 움직이고, 콜금리가 다시 금융시장을 건드리고, 금융시장이 다시 경제에 영향을 주는 거예요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (38, "녹인(Knock-in)은 파생상품에서 기초자산 상태에 따라 수익 발생 지점과 손실 발생 지점이 있습니다.", "TRUE", "FALSE", "", "TRUE", "채권·주가지수·개별종목 등 기초자산이 있는 파생상품의 경우, 기초자산 상태에 따라 수익 발생 지점과 손실 발생 지점이 있습니다. 기초자산이 +특정 조건을 만족하면 수익이 나고, 특정 조건에서 벗어나면 손실이 발생해요. 이때, 파생상품에서 손실이 발생해 원금이 손실되는 것을 ‘녹인(Knock-in)’이라고 합니다. 원금손실구간에 진입하는 것을 ‘녹인 배리어(Knock-in barrier)’를 터치했다고 합니다. 기초자산이 있는 금융상품에 투자할 때는 ‘녹인(Knock-in)’ 조건을 반드시 살펴보고, 숙지해야 합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (39, "대체투자는 주식과 채권시장과 상관관계가 적은 자산에 투자하는 것을 뜻해요.", "TRUE", "FALSE", "", "TRUE", "대체투자는 주식과 채권시장과 상관관계가 적은 자산에 투자하는 것을 뜻해요. 구체적으로는 오피스, 호텔 등 부동산이나 사모펀드를 통한 기업 지분 투자, 인프라 투자 등이 있습니다. 중간 정도의 위험, 중간 정도의 수익률을 보여서 비교적 안정적이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (40, "대출우대금리는 대출받은 금액에 대한 특별한 금리를 말해요.", "TRUE", "FALSE", "", "TRUE", "대출우대금리(Loan Prime Rate, LPR)는 은행이 최우량 고객에게 제공하는 금리로 ‘사실상 중국의 기준금리’로 여겨집니다. +\n18개 시중은행이 매달 LPR을 중국 당국에 제출하면, 당국에서는 그 평균값을 내서 발표해요. \n우리나라는 금융통화위원회에서, 미국은 FOMC에서 기준금리를 결정합니다. +\n반면, 중국은 LPR을 기준으로 은행들이 일반 고객의 대출금리를 정합니다. 이렇게 해야 실질 대출금리를 낮출 수 있다는 게 중국 인민은행의 입장이에요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) + +values (41, "덤핑은 물건을 저가에 대량으로 팔아버리는 것을 말하는 단어입니다.", "TRUE", "FALSE", "", "TRUE", "‘덤핑(dumping)’은 쓰레기를 갖다 버리듯이 물건을 저가에 대량으로 와르르 팔아버리는 걸 뜻하는 단어예요. 저렴하게 파는 ‘할인 판매(세일)’와 ‘덤핑’ 사이에 절대적인 기준은 없어요. 다만 판매가가 원가보다 낮을 정도로 채산성(수익성)을 전혀 신경쓰지 않는다면 덤핑에 해당한다고 볼 수 있어요. 업계에서는 원가를 아니까 경험적으로 구분할 수 있죠. 덤핑은 정상가격으로 판매하는 업자들의 사정을 어렵게 만들어 시장질서를 교란시키기 때문에 다들 예민하게 반응하는 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (42, "디커플링(탈동조화)은 경제 상황이 부작용을 감수하고 독자적인 경제정책을 운영하거나, 서로 연관성이 옅어지는 현상을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "보통 한 나라의 경제는 그 나라와 관련 있는 다른 나라의 경제 상황과 비슷하게 흘러갑니다. 서로 무역과 투자를 하며 연결돼 있기 때문에 한 나라에서 너무 큰 변화가 일어나면 다른 나라도 어느 정도 그 변화에 따라가는 거예요. 이런 흐름을 커플링(동조) 현상이라고 합니다. 우리나라의 주요 교역국인 중국 경기가 좋으면 우리나라의 경기도 활발해지는 것이 자연스러운 동조의 예시입니다. 인위적인 동조화의 예시로는 미국처럼 기축통화를 가진 나라가 금리를 올리면 우리나라도 정책적으로 금리를 올리는 것이 있어요. 반대로 디커플링(탈동조화)은 부작용을 감수하고 독자적인 경제정책을 운영하거나, 어떤 계기로 서로 연관성이 옅어지는 현상이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (43, "리밸런싱은 포트폴리오를 주기적으로 점검하여 나의 자산배분 목표에 맞게 다시 +밸런스를 잡아주는 것이에요.", "TRUE", "FALSE", "", "TRUE", "포트폴리오는 자산배분 현황을 한눈에 보여줍니다. 리밸런싱은 포트폴리오를 주기적으로 점검해서 나의 자산배분 목표에 맞게 다시 밸런스를 잡아 주는 거예요. 돈관리를 건강한 몸 만들기로 비유해 볼게요. 가계부를 작성하는 건 내가 섭취하고 소비하는 칼로리를 기록하는 과정이고, 리밸런싱은 주기적으로 인바디를 체크해서 몸의 상태를 점검하는 거라고 볼 수 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (44, "리베이트는 기업 간의 거래에서 큰 금액이 오가는 경우에 빈번하게 일어나는 관행으로, ‘판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’이라고 할 수 있습니다.", "TRUE", "FALSE", "", "TRUE", "리베이트(rebate)는 프로모션의 한 종류입니다. 리베이트는 큰 금액이 오가는 기업과 기업 사이(B2B) 거래에 빈번하게 일어나는 관행이에요. 쉽게 말해 ‘판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’이라고 할 수 있죠. 예를 들어, A 회사가 1000만 원짜리 기계 10개를 B 회사에 판매하고 1 억 원을 받은 다음, 판매 금액의 10%인 1000만 원을 다시 B 회사에 돌려주는 것이 바로 리베이트예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (45, "리볼빙은 카드대금을 갚는 세 가지 방식 중 하나예요. 이 중에 ‘일부 금액’이 비율(%) 로 결정됩니다.", "TRUE", "FALSE", "", "TRUE", "리볼빙은 카드대금을 갚는 세 가지 방식 중 하나예요. ‘일부 금액’은 비율(%)로 결정됩니다. 이번 달에 갚을 총금액이 100만 원이고 리볼빙의 결제 비율을 10%로 설정한 경우를 가정해 볼게요. 이번 달에 낼 결제대금은 100만 원의 10%, 10만 원입니다. 나머지 90만 원은 다음 달로 넘어가요. 여기에 함정이 있습니다. 이번 달만이 아니라, 다음 달에도 전체 결제대금의 10%만 결제되고 나머지 90%는 다음 달로 넘어갑니다. 그다음 달에도 마찬가지예요. 문제는 갚아야 하는 원금에 ‘지난달에서 넘어온 돈’만이 아니라 ‘이번 달에 소비한 돈’ 까지 들어간다는 점이에요. 이게 반복되면 결제 대금이 눈덩이처럼 늘어나요. 게다가 리볼빙의 평균 대출금리는 10~15%에 달합니다. 당장은 결제대금에 대한 부담을 줄일 수 있지만, 순식간에 대출잔액이 늘어날 수 있는 고금리 대출상품이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (46, "리츠는 투자자들의 돈을 모아 부동산에 투자하고, 임대료·매각 차익 등 수익을 +배당으로 돌려주는 방식입니다.", "TRUE", "FALSE", "", "TRUE", "리츠는 다양한 부동산 자산을 묶어둔 투자상품입니다. 투자자들의 돈을 모아 부동산에 투자하고, 임대료·매각 차익 등 수익을 배당으로 돌려주는 방식이에요. 리츠를 통해 적은 돈으로도 부동산 시장에 투자할 수 있어요. 이 중 주식시장에 상장된 리츠를 ‘공모 리츠’라고 합니다. 리츠도 일반 기업이 주식시장에 상장될 때 밟는 과정을 똑같이 거쳐요. 리츠 투자로 얻을 수 있는 수익은 크게 두 가지가 있습니다. 리츠를 낮은 +가격에 사서 비싼 가격으로 팔아서 얻는 시세차익과 배당금을 받는 배당 수익이에요. 리츠는 배당 수익에 무게가 쏠려있는 투자상품이에요. 매년 배당가능이익의 90% 이상을 의무적으로 배당하고 있어서, +주주들에게 높은 배당금을 지급하는 걸로 유명합니다.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, + +option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (47, "마이너스통장은 신용대출의 방법 중 하나로서 부동산 같은 담보를 걸어놓지 않고 내 신용만을 믿고 빌려주는 방식입니다.", "TRUE", "FALSE", "", "TRUE", "마이너스통장은 신용대출의 방법 중 하나예요. 일단 부동산 같은 담보를 걸어놓지 않고 오직 내 신용만을 믿고! 약속한 한도만큼의 돈을 빌려주는 게 신용대출입니다. 신용대출에도 종류가 있습니다. 대출을 받을 때 빌리는 방식을 선택할 수 있어요. 건별로 한 번에 얼마씩 빌리는 방법이 있고 한도 내에서 통장에서 필요할 때 찾아 쓰는 방식이 있습니다. 건별로 빌리는 건 그대로 신용대출이라 불러요. 이 중 한도 내에서 통장에서 필요할 때 찾아쓰는 방식을 활용한 상품을 마이너스통장이라 부르죠.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (48, "증권사에서는 보고서로 상장 기업의 주식에 대한 의견과 목표 주가를 발표하여, 가까운 미래에 도달할 것으로 예상하는 목표 주가를 제시합니다.", "TRUE", "FALSE", "", "TRUE", " 증권사에서는 보고서로 상장 기업의 주식에 대한 의견과 목표 주가를 발표합니다. 기업의 이익 전망치를 고려해, 해당 기업의 주식을 살지(Buy), 팔지(Sell), 그대로 있을지, 비중을 확대할지, 비중을 축소할지 등의 의견을 내고 가까운 미래에 도달할 것으로 예상하는 목표 주가를 제시해요. 증권사 보고서는 의견과 목표 주가에 대한 이유를 중심으로 참고하는 게 좋습니다. 우리나라 증권사는 ‘팔자 (Sell)’ 의견을 거의 내놓지 않고, 목표 주가도 높게 잡는 경향이 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (49, "물적분할은 특정 기업이나 사업부문을 분할하여 이를 독립적으로 운영하는 것을 말해요.", "TRUE", "FALSE", "", "TRUE", "물적 분할은 ‘기업 분할’의 한 종류입니다. 기업 분할은 말 그대로 기업을 나누어서 가른다는 뜻이에요. +\n물적 분할은 어떤 기업(모기업)이 특정 사업부를 독립적인 회사(자회사)로 분리하면서, 모회사가 자회사의 지분 100%를 소유하는 걸 뜻해요. 기존에 모회사 투자자에게 자회사 주식이 돌아가지 않아요. \n자회사로 독립한 (구)사업부 때문에 모기업에 투자했던 투자자에게는 참 아쉬운 상황이에요. 직접적인 관련 없이 건너건너 아는 사이가 된 거니까요. +\n만약 자회사가 주식시장에 상장한다면? 모기업에 투자했던 투자자 입장에서는 배신감이 들 수밖에 없어요. 그동안 열심히 투자금을 보태왔더니, 알짜 사업을 갖고 따로 상장해버리는 거니까요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (50, "주가가 잘 오르다 말고 갑자기 큰 폭으로 하락하는 것은 반락입니다.", "TRUE", "FALSE", "", "TRUE", "영어로는 ‘a reactionary fall’로 주가가 잘 오르다 말고 갑자기 큰 폭으로 하락하는 현상을 뜻해요. 눌렀을 때 튀어 오른다는 뜻인 ‘반발’의 반대 의미라고 볼 수 있어요. ‘급락’과는 다릅니다. ‘주가가 크게 떨어졌다’는 상황 자체를 강조할 때는 급락을, ‘주가가 계속해서 오르고 있었다가 갑자기 떨어졌다’는 현상을 강조할 때는 ‘반락’을 사용해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (51, "벌지 브래킷은 전 세계를 상대로 채권이나 주식을 인수하고 글로벌 기업 M&A 자문을 하며 기업과 정부의 자금 조달을 주선하는 초거대 일류 투자은행을 말합니다.", "TRUE", "FALSE", "", "TRUE", "전 세계를 상대로 1 채권이나 주식 같은 유가증권을 인수하고 2 글로벌 기업 M&A( 인수합병) 자문을 하기도 하며 3 기업과 정부의 자금 조달을 주선하고 중개하는 등 투자은행이 할 수 있는 거의 모든 일을 하는 초거대 일류 투자은행을 말합니다. 투자은행은 장기적인 산업 자금을 담당하며, 개인은 상대하지 않습니다. ( ) 투자은행 중 벌지 브래킷은 약자로 ‘BB’라고 부르기도 해요. 현재 전 세계에 딱 아홉 개의 투자은행이 BB입니다. 바로 JP모건, 골드만삭스, 모건스탠리, 뱅크오브아메리카 메릴린치, 씨티그룹, 크레디트스위스, 바클리즈은행, 도이체방크, UBS예요.", +"TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (52, "베이지북은 특정 주식이 지난 mấy주 동안 기록한 가장 높은 주가를 말하는 것은 아닙니다.", "TRUE", "FALSE", "", "TRUE", "미국 연방준비제도이사회(연준)는 매년 8회 ‘ 베이지북’을 공개합니다. +\n연준 산하의 12개 지역 연방준비은행이 각 지역경제를 조사 및 분석한 보고서예요. 일종의 미국 경제 최신 동향 보고서라고 볼 수 있어요. 미국의 경제 현황을 파악하는 데 중요한 기준이 되기 때문에 눈여겨볼 필요가 있어요. +\n참고로 원래는 표지가 빨간색이라서 ‘레드북’이라고 불렸는데요. 일반인에게 공개되기 시작하면서 + +표지는 베이지색으로, 이름은 ‘베이지북’으로 바뀌어 불리게 됐답니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (53, "벤치마크는 금융시장에서 수익률의 기준을 의미하는 용어입니다.", "TRUE", "FALSE", "", "TRUE", "기준점 또는 표준을 의미합니다. 원래는 토목공학에서 토지 높이를 잴 때 기준점을 의미하는 용어였는데, 지금은 IT에서 성능 테스트를 할 때나 금융시장에서 목표 수익률을 정할 때도 활용하고 있어요. 금융에서 벤치마크 금리라고 하면 수익률의 기준이 됩니다. 미국 국채 10년물은 가계대출과 기업대출 등 다른 금융상품과 연동이 되어 있기 때문에 자주 시장의 벤치마크가 돼요. 미국 국채 10년물 금리를 기준으로 시장을 판단하겠다는 거예요. 개인 투자를 할 때도 활용할 수 있어요. 현재 주택담보대출 금리를 벤치마크 금리로 삼겠다고 하면, 현재 주택담보대출 금리보다는 더 벌어야 제대로 수익을 냈다는 의미예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (54, "보험회사의 보호예수가란, 고객이 예약금을 지불하여 얻는 이익이란 것입니다.", "TRUE", "FALSE", "", "TRUE", "보호예수(保護預受)는 ‘보호하다(보호) + 맡기다(예) + 받다 (수)’로 구성된 한자어입니다. 여기서 ‘예수’는 귀중품, 유가증권 등 어떤 것(주로 가치 있는 것)을 금융회사가 보관하는 것을 뜻해요. +\n우리나라 증권시장에는 어떤 요건에 해당하는 주주가 일정 기간 동안 보유한 주식을 사고 팔지 못하게 제한하는 ‘주식매도제한(Lock up)’이 있습니다. +\n보호예수는 ‘주식매도제한’을 실현하기 위한 장치 중 하나입니다. 기업의 주식을 많이 가진 최대주주 또는 특수관계인(투자자 등)이 일정 기간 주식을 매도하지 않도록 일시적으로 제한하는 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (55, "분양가상한제는 민간택지 분양가에 상한선을 정한 제도로, 주택공급이 위축되면서 적용대상을 강화해 제도가 흐지부지된 적이 있었다.", "TRUE", "FALSE", "", "TRUE", " 분양가상한제는 분양가에 상한선을 정한 제도입니다. 분양가상한제는 1977년 처음 도입된 후에 폐지와 부활을 반복했는데요. 2020년 7월 29일부터 시행된 분양가 상한제의 정식 명칭은 ‘민간택지 분양가상한제’입니다. 초기 분양가상한제는 공공택지에만 적용됐다가 2007년에 처음으로 민간택지에도 도입됐어요. 도입 이후 주택공급이 위축되면서 분양가상한제가 적용되는 민간택지의 요건을 강화해 제도가 흐지부지된 적이 있었는데요. 2020년부터 적용대상과 기준을 개정한 민간택지 분양가상한제를 시행했습니다. 2007년에 시행될 때는 전국에 동시 적용하는 제도였지만, 2020년부터 새롭게 적용된 민간택지 분양가상한제는 ‘투기과열지구’에만 적용됐습니다. 민간택지의 분양가상한가격은 ‘택지비+ 건축비’로 산정됩니다. 여기에 2022년 6·21 부동산대책으로 주거이전비, 손실보상비 등 추진과정에서 필수적인 요인의 합리적인 반영분과 자재가격 급등 반영분이 추가되었어요. 여기서 관건은 ‘택지비’ 입니다. 택지비는 시세가 아니라 감정평가액을 기준으로 하기 때문에 주변 땅값 시세보다 낮게 나와요. 택지비 감정평가액의 객관성도 중요한데요. 6·21 부동산대책으로 외부 검증위원회를 신설하는 규정이 생겼습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (56, "불만의 겨울은 영국에서 일어난 정치현상으로, 당시 정부가 인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데 노동조합이 크게 반발했습니다.", "TRUE", "FALSE", "", "TRUE", "불만의 겨울은 1978~1979년 영국에서 일어났던 정치현상이에요. 당시 영국 정부는 인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데, 노동조합이 크게 반발했습니다. 정부와 노조의 대립은 극단적으로 심해졌고, 사람들은 어느 편도 들지 않았어요. 이 현상은 정권이 바뀌며 마거릿 대처가 총리로 등장하는 데 영향을 주었어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (57, "불완전판매는 금융회사가 소비자에게 금융상품을 판매하는 과정에서 반드시 지켜야 할 사항을 누락하거나 정보를 허위, 과장하게 판매한 경우를 말해요.", "TRUE", "FALSE", "", +"TRUE", "은행, 증권사, 보험사 등 금융회사가 소비자에게 금융상품을 판매하는 과정에서, 반드시 지켜야 할 사항을 누락했거나 정보를 허위, 과장해서 소비자가 상품에 대해 잘못 인식하도록 판매한 사례를 뜻합니다. 원금 손실이 발생하는 금융 상품을 판매할 때, 은행은 고객에게 원금 손실이 발생한다는 사실을 고지하지 않았거나, ‘절대 손해보지 않는 안전자산’이라고 설명하는 식입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (58, "블랭크 세일링은 화물선 임시결항으로, 운송 수요나 운임이 급감할 때 피해를 + +최소화하려고 예정된 운항 전체나 특정 항구 정박을 취소하는 것을 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "블랭크 세일링(Blank Sailing)은 화물선 임시결항으로, 운송 수요나 운임이 급감할 때 피해를 최소화하려고 예정된 운항 전체나 특정 항구 정박을 취소하는 것을 뜻해요. 블랭크 세일링이 발생하면 개별 회사나 개인 소비자는 주문한 상품이 배송되기까지 더 많은 시간을 기다려야 할 수 있습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (59, "블록 경제는 서로 자유롭게 거래하는 국가들이 결집해 만드는 경제 시스템으로, 장벽을 쌓는 것은 외부 국가들과의 교섭을 저해해요.", "TRUE", "FALSE", "", "TRUE", "정치적, 경제적으로 관계가 깊거나 비슷한 문화를 가진 여러 국가가 결집해 ‘블록(block)’을 만드는 경제 시스템이에요. 블록 안에서는 서로 자유롭게 거래하는 반면, 블록 바깥 국가와는 거리를 두고 장벽을 쌓곤 합니다. 블록 경제는 식민지를 이용한 경제시스템이 돌아가던 18~19세기와, 1920~1930년대 대공황 이후 미·소 냉전 시절에 등장한 적이 있습니다. 현재 코로나19 팬데믹 이후 글로벌 공급망을 재편하면서 다시 경제가 블록화되고 있어요. 대체로 러시아와 중국을 한 블록으로 묶고, 미국을 +중심으로 한 국가를 한 블록으로 묶습니다. 인도나 동남아시아는 어디에도 끼지 않고 실리를 챙기려는 움직임을 보이고 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (60, "블록딜은 특정 주식이 특정 기간동안 기록한 가장 높은 주가를 말하는 데 대한 기준이 아니다.", "TRUE", "FALSE", "", "TRUE", "블록딜은 아주 많은 주식을 기관투자자 같은 대형 투자자에게 한 번에 넘기는 방식의 거래예요. +\n블록딜은 시장가보다 할인된 가격으로 진행되는 경우가 많습니다. 대량으로 주식을 사는 대상에게 할인가를 적용해 주는 거예요. +\n블록딜은 보통 시간외거래로 진행됩니다. 주식을 대량으로 보유한 주주가 블록딜 주관사(증권사와 같은 기관투자자)와 약속하고, 정규장이 마감된 뒤에 주식을 사고파는 식이에요. +\n블록딜은 기업 간 인수합병이나 경영상 이유로 기업에 많은 현금이 필요할 때 이루어지곤 합니다. \n블록딜이 정규장 시간대에 이뤄지면 매도물량이 쏟아져 나오면서 주가가 떨어질 수 있습니다. 증시에도 충격을 줄 수 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (61, "비경제활동인구는 취업하고 싶어도 일할 수 있는 능력이 없는 사람을 포함하지 않습니다.", "TRUE", "FALSE", "", "FALSE", "만 15세가 넘은 인구 가운데 취업자도 실업자도 아닌 사람을 뜻해요. 취직할 의사가 없고 구직활동을 하지도 않는 사람이 비경제활동인구에 속합니다. 실업자는 취업할 의지가 있고, 실제로 구직활동을 하는데도 취직하지 못하고 있는 사람이에요. 비경제활동인구는 일을 하고 싶어도 일할 수 있는 능력이 없는 사람도 포함해요. 또, 전업주부나 군인, 학생 등도 비경제활동인구에 속합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (62, "비둘기파는 2당파를 조절하는 데 사용되는 투표 방식으로, 의회에서 일정한 수의 표를 얻어야 하거나 특정 조건을 만족해야 한다.", "TRUE", "FALSE", "", "TRUE", "경제정책을 +이야기할 때, 종종 ‘비둘기’와 ‘매’가 등장하곤 합니다. +\n‘비둘기파’는 경기 부양을 위해 금리를 낮추고 시장에 돈을 푸는 양적완화를 주장하는 사람을 뜻하고, +‘매파’는 경기 과열을 막고 물가를 안정시키기 위해 금리를 높여야 한다고 주장하는 사람들 뜻해요. \nFOMC 파월 의장은 비둘기파와 매파의 중간인 ‘올빼미파’로 불립니다. 비둘기 혹은 매, 둘 중 하나로 치우쳐지지 않는 새로운 성향을 의미한다고 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (63, "빅스텝이란 기준금리를 올릴 때 0.25%p씩 올리는 것이 아니라, 한꺼번에 두 단계를 올리는 것을 말해요.", "TRUE", "FALSE", "", "TRUE", "보통은 기준금리를 올릴 때 0.25%p씩 올려요. 이번에는 0.25%p의 두 배인 0.50%p 만큼 올린 건데요. 이렇게 한꺼번에 두 단계를 올리는 것을 두고 ‘빅 스텝’이라고 불러요. 세 단계(0.75%p)를 올릴 때는 ‘자이언트 스텝’이라고 표현합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (64, "사모펀드는 투자자가 함께 모은 펀드를 말해요.", "TRUE", "FALSE", "", "TRUE", "펀드는 우리 말로 ‘기금’입니다. 기금은 ‘어떤 목적을 위해 모은 돈’을 뜻해요. 우리가 흔히 얘기하는 펀드는 자산을 불리기 위한 목적이 있습니다. +\n펀드는 투자자의 규모에 따라 ‘공모펀드’와 ‘사모펀드’로 나뉩니다. ‘공모펀드’는 불특정 다수에게 공개적으로 모집하는 펀드입니다. 주변에서 ‘펀드에 투자한다’고 하면 대부분 공모펀드라고 이해하면 + +돼요. +\n‘사모펀드’는 사적으로 모인 펀드입니다. 49인 이하의 투자자를 대상으로 공모펀드보다는 제한적이죠. +적은 모집인원에, 투자 금액도 최소 3억 원이라는 조건이 있습니다. +\n사모펀드 투자자 중에는 법인회사나 기관 투자자의 비율이 높아요. 개인 투자자 중에서는 은행, 증권사에 목돈을 맡겨둔 자산가, 노후자산을 맡겨둔 고령자가 사모펀드에 가입하곤 합니다. \n2019년~2020년 사이 사모펀드와 관련된 피해가 많았습니다. 라임자산운용이 운용한 ‘라임펀드’에서 발생한 ‘라임펀드 사태’가 대표적이었죠. 당시 라임펀드에 투자한 개인투자자 중 46%가 60대 이상의 고령자였어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (65, "사전청약은 특정 일정 전에 예약하거나 신청하는 것을 말합니다.", "TRUE", +"FALSE", "", "TRUE", "청약은 한자어로 ‘계약을 체결할 것을 요청하는 행위’를 뜻합니다. 새로 짓는 아파트를 분양 받을 권리(분양권)를 청약하는 것이 ‘주택청약’이에요. +\n청약은 보통 아파트 착공 후에 이루어집니다. 사전청약은 이보다 1~2년 이상 앞서서, 지구계획이 승인된 이후로 청약을 받는 제도예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (66, "산업활동동향은 경제의 성장률을 나타내는 지표 중 하나입니다.", "TRUE", "FALSE", "", "TRUE", "산업활동동향은 각 산업부문별 성적표로 크게 생산, 소비, 투자, 경기로 나눠서 동향을 분석해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (67, "유가증권시장'은 코스피, 코스닥, 코넥스를 통틀어 가리키는 말로는 쓰이지 않고, 오로지 코스피 시장을 가리키는 말로만 쓰인다.", "TRUE", "FALSE", "", "TRUE", "‘상장’은 기업이 데뷔하는 거예요 +\n상장은 기업이 공식적으로 유가증권시장 등 금융상품이 유통되는 시장에 등록해서, 기관 및 개인 투자자들이 자사 주식을 공개적으로 매매 및 유통할 수 있도록 하는 걸 말해요. 한자를 그대로 옮기면 ‘매대에 올린다’는 뜻이고, 영어로는 ‘be listed (company)’, 즉 명부에 등록됐다고 표현해요. \n일단 상장하고 나면, 유통시장에 들어와 있는 투자자들의 돈이 해당 기업에 수월하게 닿을 수 있어 자금 조달이 무척 용이해져요. 그만큼 상장사로 등록하기 위한 조건은 무척 까다로워요. 일정 수준 이상의 실적과 신뢰는 기본으로 갖춰야 하죠.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (68, "상장폐지를 의미하는 것은 기업이 주식시장을에서 철수하거나 종료하는 것을 말해요.", "TRUE", "FALSE", "", "TRUE", "어떤 기업의 주식이 코스피, 코스닥, 코넥스와 같은 주식시장에서 거래되려면, 그 기업이 주식시장에 상장(上場)해야 해요. 한자 그대로 해석하면 ‘시장에 명패를 내건 다’는 뜻입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (69, "생산자물가지수(PPI)는 제조업체의 가격이 상승하거나 하락하는 것을 나타내는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "생산자물가지수(Producer Price Index, PPI)는 생산자 입장에서 측정한 물가입니다. 생산자가 물건과 서비스를 만드는 데 사용하는 상품과 서비스의 평균가격이라는 뜻이에요. +\n생산자물가가 상승하면 소비자물가가 올라요. 다시 말해, 인플레이션으로 이어질 가능성이 커요. 특히 미국의 인플레이션은 전 세계 시장에 영향을 미치기 때문에 미국의 생산자물가와 소비자물가 관련 지표를 주목하곤 합니다. +\n미국이 자국 경기 상황이 과다한 인플레이션 국면에 접어들었다고 판단하면, 기준금리를 올릴 수 있습니다. 기준금리를 조정해 시장에 풀리는 돈의 양을 조절하는 방식으로 인플레이션을 가라앉히려고 하는 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (70, "서비스 수지는 서비스를 사고 팔아 발생한 수입과 지출의 차이를 뜻해요.", "TRUE", "FALSE", "", "TRUE", "‘수지’는 한 나라가 다른 나라와 경제적 거래를 나눈 결과 발생한 수입과 지출을 뺐을 때 얼마인지 따져보는 거예요. 장사를 잘 해서 흑자를 보면 수지 흑자, 수입이 더 많아서 적자를 보면 수지 적자라고 합니다. 서비스 수지는 서비스를 사고 팔아 발생한 수입과 지출의 차이를 뜻해요. 서비스 수지에는 운수·여행·통신서비스·보험서비스·특허권 등 사용료·사업서비스·정부서비스· 기타서비스 8개 항목이 포함됩니다. 우리나라 서비스 수지는 보통 적자예요. 해외 교육 서비스나 해외 여행, 해외 로열티 지급 등의 서비스 지출이 굉장히 많거든요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, + +option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (71, "선물은 특정 상품이나 주식의 미래 가격을 예측하는 거래를 말합니다.", "TRUE", "FALSE", "", "TRUE", "선(先) + 물건 물(物). 한자 뜻 그대로 미래의 특정 시점에 물건을 사고파는 약속을 의미합니다. +\n선물거래는 농산물 시장에서 시작됐어요. 배추, 쌀, 밀과 같은 농·축·수산물은 생산량에 따라 가격변동이 특히 심하기 때문에, 미래의 가격을 미리 정해주는 선물거래를 이용해 가격변동 위험을 줄이려 했어요. +\n선물거래에는 두 가지의 지불 방법이 있어요. 현물을 직접 거래하는 인수도결제가 있고요. 현물을 직접 거래하지 않고 차익만 거래하는 현금거래가 있습니다.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (72, "소득공제는 세금을 매기는 기준이 되는 ‘소득’을 덜어주는 것이다.", "TRUE", "FALSE", "", "TRUE", "우리는 벌어들인 소득에 대한 세금을 내야 합니다. 세금은 소득을 신고할 때 내는데, 정부 정책 등으로 세금을 깎아주는 경우도 있어서 나중에 정산하는 절차가 필요해요. 직장인의 경우, 이 절차가 ‘연말정산’입니다. 세금을 깎아주는 방식은 크게 소득공제와 세액공제로 나뉩니다. 소득공제는 세금을 매기는 기준이 되는 ‘소득’을 덜어주는 것이고, 세액공제는 소득을 기준으로 계산한 ‘세금’에서 얼마간 덜어주는 것입니다. 연말정산을 할 때, 소득공제와 세액공제를 적용받고 난 ‘ 결정세액’을 계산합니다. 그리고 이 결정세액을 ‘내가 이미 낸 세금(기납부세액)’과 비교해, 더 낸 만큼 돌려받거나 덜 낸 만큼 더 내요. ‘연말정산 이후 돈을 토해냈다’고 하는 경우, 결정세액이 기납부세액보다 컸다는 뜻이에요. 반대로 ‘13월의 월급을 받았다’라고 하는 경우는 결정세액이 기납부세액보다 작다는 뜻입니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (73, "소비자물가지수가 특정 주식의 가치 추세를 나타내는 지표입니다.", "TRUE", "FALSE", "", "FALSE", "CPI는 ‘소비자물가지수(Consumer Price Index)’의 약자입니다. 시장에서 거래되는 모든 상품과 서비스의 가격을 중요도에 따라 가중치를 주어 평균을 낸 가격이에요. \nCPI는 어느 나라에서나 가장 기초적인 경제지표입니다. 1 (소득 관련 지표와 비교해) 소비자의 실제 생활 수준을 가늠할 수 있고 2 실제 경기와 가계의 소비 구조를 파악할 수 있고 3 각종 재정·경제 정책 결정의 기준·근거가 돼요. +\n미국의 CPI는 특히 중요합니다. 1 미국 GDP의 약 70%를 차지하는 민간소비의 실제 주체인 소비자의 행동을 파악할 수 있고 2 달러 인플레이션과 환율에서 강세, 약세 여부를 판단할 수 있고 3 이에 따른 미국의 금리 정책이 우리나라 증시와 교역에 많은 영향을 주기 때문이에요. +\n미국의 CPI는 매월 미국 고용통계국에서 발표합니다. 코로나19가 확산된 해인 2020년 12월부터 꾸준히 오르고 있어요. ‘이번에는 또 얼마나 올랐을까’ 걱정하는 뉴스가 매달 이맘때 쏟아지는 이유예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (74, "수요예측은 특정 제품이나 서비스의 판매량을 미래에 예측하는 것을 말합니다.", "TRUE", "FALSE", "", "TRUE", "수요예측은 공모주의 가격인 공모가를 결정하기 위해 수요상황을 파악하는 걸 말합니다. +\n공모주: 기업이 상장할 때는 신주(새로운 주식)를 발행하고 신주의 주인을 공개적으로 모집하는 ‘ 공모’ 단계를 거칩니다. 이때의 신주를 ‘공모주’라고 해요. +\n공모가: 공모주에는 상장 전에 거래되던 주식 가격이 아닌 새롭게 책정된 가격, 즉 공모가를 적용해야 합니다. 공모가는 먼저 대표주관회사가 발행 주식의 공모희망가격(밴드)을 제시하는 걸로 기준이 정해집니다. +\n수요상황 파악: 증권사, 보험사, 국민연금 등 기관투자자에게 수요예측을 실시해 공모희망가격 구간 내에서 얼마의 가격에 몇 주를 사고 싶냐는 수요를 물어봅니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (75, "수율은 반도체에서 ‘결함이 없는 합격품의 비율’을 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "수율은 한자어예요. 무언가를 거둔다는 뜻의 ‘수(收)’, 비율 ‘율(率)’로 이루어져 있습니다. 반도체에서 수율은 ‘결함이 없는 합격품의 비율’을 뜻해요. 웨이퍼 한 장에 들어갈 수 있는 칩의 최대 개수 중, 정상적으로 작동하는 칩의 개수를 나타냅니다. 반도체 기업에서 수율을 높이는 +것은 굉장히 중요해요. 수율이 높아질수록, 같은 원자재를 투입해서 더 많은 합격품을 만들어낼 수 있으니까요. 삼성전자, SK하이닉스 등 우리나라의 주요 반도체 기업도 수율을 끌어올리기 위해 기술을 개발하고 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) + +values (76, "스미싱은 문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하여 금융정보를 탈취하는 수법입니다.", "TRUE", "FALSE", "", "TRUE", "스미싱(Smishing)은 ‘ 문자메시지(SMS)’와 ‘피싱(Phishing)’을 합친 단어예요. 문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하는데요. 이후 악성 앱을 설치하거나 전화를 유도해 금융정보, 개인정보를 탈취하는 수법으로 사기에 이용해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (77, "스톡옵션이라고 하는 것은 주식을 살지 말지 선택할 수 있는 권리입니다.", "TRUE", "FALSE", "", "TRUE", "스톡옵션의 상법상 정식 명칭은 주식매수선택권입니다. 말 그대로 주식을 살지 말지 선택할 수 있는 권리라는 뜻인데요. ‘계약 당시에 정해놓은 가격’으로 살 수 있다는 게 엄청난 메리트입니다. 현재 주가가 올랐더라도, 싼 가격에 주식을 살 수 있다면 시세차익으로 돈을 벌 수 있으니까요. 대신 조건이 있습니다. 상법상, 스톡옵션은 회사에서 부여받은 시점을 기준으로 2년 이상 재직해야 행사할 수 있어요. 예를 들어볼게요. 독자님이 ‘어피티 주식을 1만 원에 살 수 있는 스톡옵션’을 받았습니다. 2년 뒤, 어피티가 폭풍 성장해서 주식 가격이 3만 원으로 올랐더라도 독자님은 주식을 1만 원으로 살 수 있어요. 그럼 독자님은 시세보다 훨씬 싸게 주1식을 사고, 다시 시세에 맞게 주식을 팔아서 그 차익으로 돈을 벌 수 있겠죠? 물론, 주식을 싸게 산 뒤에도 앞으로 더 오를 거라고 생각하면 계속 보유할 수 있습니다. 얻는 게 돈뿐만은 아닙니다. 최소한 스톡옵션에 +기재된 권리 행사 시점까지는 열심히 일할 동기부여가 될 테니까요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (78, "스팩(SPAC)은 특정 주식이 지난 얼마나 기간 동안 기록한 가장 높은 주가를 말해요.", "TRUE", "FALSE", "", "FALSE", "스팩(SPAC)은 ‘Special Purpose Acquisition Company’의 줄임말이에요. 그대로 번역하면, ‘기업 인수를 목적으로 하는 기업’을 뜻합니다. +\n스팩이 먼저 주식시장에 상장한 뒤, 상장하지 않은 상태의 기업(비상장기업)을 인수합니다. \n스팩은 ‘긁지 않은 복권’이라고 부르기도 해요. 어느 회사를 인수할지 정해지지 않은 상태에서 공모에 들어가기 때문이에요. +\n스팩이 특정 회사를 인수한다는 설이 돌면 스팩의 주가가 크게 뛰곤 합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (79, "스팩이 모은 돈으로 인수하는 기업의 이름을 공개하지 않는다.", "TRUE", "FALSE", "", "TRUE", "전통적인 기업공개 절차에서는 외부 회계 법인을 통해 회계 감사를 받고 감사보고서와 재무제표를 작성, 증권신고서와 함께 제출해요. 이때 금융감독원의 심사를 통과한 후 다시 한국거래소의 심사를 받아야 하는데요, 스팩은 실제 운영하지 않는 회사이므로 감사보고서 작성과 증권신고서 제출 절차에서 크게 증명할 것이 없어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (80, "스팩합병은 기업이 다른 기업의 주식을 모두 사가면서 모든 자산과 부채를 흡수하는 방식으로, 인수 합병의 한 형태입니다.", "TRUE", "FALSE", "", "TRUE", "스팩(SPAC, Special Purpose Acquisition Company)은 기업 인수를 목적으로 상장하는 종목입니다. 비상장 회사와 법적으로 합치는 데 필요한 페이퍼 회사예요. +\n투자자들이 돈을 모아 스팩을 주식시장에 상장시킨 뒤 비상장 회사와 합병하고 합병된 기업이 상장회사가 됩니다. 이를 ‘스팩합병’을 통한 상장이라고 해요. +\n지난해 1분기까지 미국에서 스팩 상장은 일반적인 기업공개(IPO) 상장보다 훨씬 쉬웠어요. 하지만 스팩 투자가 과열되자, 미국 당국이 기준을 까다롭게 바꿨습니다. 스팩 투자 열기가 다소 식으면서 +미국 스팩에 투자한 우리나라 개인 투자자들이 손해를 보기도 했어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (81, "시간외거래는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가를 말하는 것이 아닙니다.", "TRUE", "FALSE", "", "TRUE", "미국 주식 거래 시간은 우리나라 기준으로 오후 11 시 30분부터 오전 6시까지입니다. +\n썸머타임(3월 중순~11월 초)에는 거래시간이 1시간씩 앞당겨져요. 우리나라 +\n시간 기준으로 오후 10시 30분부터 오전 5시 사이에 거래할 수 있습니다. +\n국내 주식처럼 미국 시장도 장전, 장후 시간외거래를 할 수 있는데요. 단, 시간외거래가 가능한 프리마켓(pre-market)과 애프터마켓(after-market)의 시간은 증권사마다 차이가 있습니다. \n대부분의 국내 증권사 앱에서는 실시간 시세가 아닌, 15분 지연된 시세를 보여줍니다. 실시간 시세를 보여주는 별도의 앱이나 웹에서 정보를 얻어야 해요.", "TF", 1000000, 100000, FALSE); + +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (82, "신용평가는 기업이나 개인의 재무 상황을 평가하여 그에 대한 신뢰도를 판정하는 과정을 말해요.", "TRUE", "FALSE", "", "TRUE", "개인의 신용도를 평가하는 곳은 크게 두 종류가 있습니다. 하나는 NICE 평가정보, KCB, SCI평가정보와 같은 신용평가사. 다른 하나는 은행, 카드사, 보험사와 같은 금융회사예요. +\n금융회사는 고객이 신규로 금융상품에 가입하거나 이용할 때 신용을 평가합니다. 평가정보를 +바탕으로 ‘상품에 가입할 자격이 되는지’, ‘지금 조건대로 이 상품을 계속 이용할 수 있을지’를 판단해요. +\n금융회사와 신용평가사는 신용정보에 대한 모든 걸 관리 및 수집하고 전달하는 비영리 사단법인인 ‘신용정보원’으로부터 신용정보를 가져옵니다. 이 데이터를 갖고 각 회사의 자체 신용평가모델로 평가해요. +\n‘어디에서 신용등급을 조회하는지’, ‘어떤 은행에서 대출심사를 받는지’에 따라 신용등급과 대출금리, +대출한도가 다르게 나오는 이유가 이것 때문입니다. 같은 사람, 같은 신용정보라고 해도 ‘어디에서 평가하는지’에 따라 적용되는 신용평가모델이 다르니 결과가 다르게 나오는 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (83, "실업률은 고용률과 같은 것이 아니라는 것이다.", "TRUE", "FALSE", "", "TRUE", "실업률은 ‘경제활동인구’ 중에서 ‘실업자’가 차지하는 비율을 말해요. 경제활동인구는 ‘만 15세 이상 만 60세 미만 인구 중 경제활동 의사가 있는 사람’의 수예요. 쉽게 말해, 일할 의사가 있지만 직장을 찾지 못한 사람들의 비율이 실업률입니다. 반면 고용률은 경제활동인구든 비경제활동인구든 상관없이 ‘만15세 이상 64세 미만 생산가능인구 중 취업자가 차지하는 비율’을 말해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (84, "실적은 기업의 실제 성과를 의미하는 것이다.", "TRUE", "FALSE", "", "TRUE", "기업들의 실적은 분기별로 발표되는 분기보고서, 연간으로 발표되는 사업보고서에서 확인할 수 있어요. 보고서에서 핵심은 ‘재무제표’입니다. +\n4분기 보고서를 제외하고는 모두 각 분기가 마감되는 날짜로부터 45일 이내로 분기 보고서를 제출해야 해요. +\n연초에는 전년도 사업 실적을 ‘사업보고서’로 발표하고, 외부 감사를 받은 뒤 ‘감사보고서’를 제출하는 일정 때문에 굉장히 바쁩니다. 그래서 4분기 보고서는 제출 기한을 두 배(90일)로 줘요. \n2분기 실적의 경우, 1년의 반이 지난 시점에 발표되는 실적 보고서라서 ‘반기보고서’라고도 불립니다", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (85, "어닝쇼크는 기업이 실적을 발표할 때, 시장의 기대 이상으로 실적이 좋게 나오면 +이르는 경우를 의미합니다.", "TRUE", "FALSE", "", "TRUE", "‘어닝(earning)’은 수입, +벌이라고 이해하면 돼요. 기업이 분기별로 실적을 발표할 때, 시장의 기대 이상으로 실적이 좋게 +나오면 ‘어닝 서프라이즈’, 기대에 못 미치는 수준으로 실적이 낮게 나오면 ‘어닝 쇼크’라고 표현해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (86, "역직구는 우리나라 소비자들이 해외 온라인 쇼핑몰에서 직접 물건을 구입해 들여오는 행위입니다.", "TRUE", "FALSE", "", "TRUE", "우리나라 소비자들이 해외 온라인 쇼핑몰에서 직접 물건을 구입해 들여오는 행위를 직접 구매(직구)라고 합니다. 우리나라에 정식 유통되는 상품보다 저렴하거나, 우리나라에 유통되지 않는 물건을 구매할 수 있는 장점과 관세 등 행정처리를 직접 해야 하는 불편함이 있어요. 역직구는 우리나라에서 구입할 수 있는 상품을 외국 소비자에게 직접 판매하는 거예요. 역직구 플랫폼에 입점해 셀러가 된 다음, 내가 직접 상품을 골라 판매합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (87, "예대마진은 은행의 주요 수익모델로, 대출금리가 예금금리보다 높은 차이만큼 마진을 가져간다.", "TRUE", "FALSE", "", "TRUE", "예대마진(預貸margin)은 예금할 때 ‘예’, 대출할 때 ‘대’, 마진은 ‘차액으로 남긴 이윤’을 뜻합니다. 대출이자로 얻은 수입과 예금금리로 나간 지출의 차액으로 남긴 마진이라는 뜻이에요. 예대마진은 은행의 주요 수익모델입니다. 은행 상품을 보면, 대출금리가 예금금리보다 높아요. 이 차이만큼 은행이 마진을 가져가는 거예요. 이자를 통해 남기는 이익이기 때문에 예대마진을 다른 말로 ‘이자 이익’이라고도 부르는데요. 우리나라 은행은 이자 이익이 + +전체 수익원의 80% 이상이에요. 다른 나라 은행과 비교해보면 굉장히 큰 비중을 차지하는 편이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (88, "외자판호는 외국 게임이 중국에 출시될 때 필요한 인허가권입니다.", "TRUE", "FALSE", "", "TRUE", "외자판호는 외국 게임이 중국에 출시될 때 필요한 인허가권입니다. 이 이슈를 이해하려면 2016년으로 시간을 돌려봐야 해요. 지난 2016년, 한국의 사드 배치 발표로 중국 정부는 ‘한한령(중국 내 한류 금지령)’을 내리게 됩니다. 중국인 관광객들의 한국 방문을 통제하거나 한국 상품 수입을 규제하는 등 다양한 방식으로 압박해왔죠. 콘텐츠 전반에 한한령이 적용되면서, 국내 게임시장도 시련을 겪게 됩니다. 중국에 게임을 서비스하고, 수익활동을 하려면 ‘외자판호’가 필요한데 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임시장에서 중화권 매출이 절반 이상을 차지했습니다. 2020년부터는 조금씩 외자판호를 발급받는 사례가 나오기 시작했습니다. 하지만 여전히 희귀한 수준이라서, 외자판호 발급에 성공한 게임사의 주가는 급등세를 보이곤 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (89, "외환보유액은 정부가 여유자금으로 갖고 있는 외국 돈의 총 가치를 말해요.", "TRUE", "FALSE", "", "TRUE", "개인이 은행에 돈을 저축하고, 회사가 이익금에 자본을 쌓는 것처럼 정부도 여유자금을 저장해 둡니다. 그중에서도 정부가 중앙은행이나 다른 나라의 국립은행에 넣어둔, 외국 돈으로 된 자산의 총 가치를 ‘외환보유액’이라고 불러요. 정부가 여유자금으로 갖고 있는 외화는 달러, 유로화, 위안화, 엔화 등으로 국제무역에 자주 사용된다는 공통점이 있습니다. 외환보유액의 목적은 크게 네 가지예요. 1 국제무역에서 적자가 날 경우, 그만큼 채우고(국제수지 적자 보전) 2 외국에서 빌려온 돈의 원리금을 갚고 3 환율이 너무 떨어지거나 올라가면 외환시장에 개입해 방어하고 4 우리나라에 투자하려는 개인과 회사에 신용도를 쌓는 것이에요.", "TF", 1000000, 100000, +FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (90, "우대금리는 은행에서 정한 금리를 기준으로 추가로 금리 더하거나 빼서 조정할 수 있는 금리입니다.", "TRUE", "FALSE", "", "TRUE", "우대금리는 가감조정금리라고도 부릅니다. 은행에서 정한 금리를 기준으로 추가로 금리 더하거나(가), 빼서(감) 조정할 수 있는 금리거든요. 은행과 같은 계열의 카드사에서 카드를 만들거나 은행 계좌에서 공과금을 납부하는 등 조건을 맞추면 우대금리를 제공합니다. 예금금리를 연 0.1% 인상해주거나 대출금리를 연 0.2% 내리는 식이에요. 특판 적금, 대출 상품을 자세히 살펴보면 우대금리를 적용해서 ‘최대’, ‘~부터’ 같은 단어가 붙어있습니다. 적금은 이자를 많이 받을수록 좋으니 최대 금리를 적어놓고, 대출은 이자 부담이 적을수록 좋으니 최저 금리를 적어놓은 거예요. 브랜드 세일 광고에 최대 할인율을 적어두는 것처럼 고객 입장에서 최대 혜택을 받을 수 있는 금리를 보여주는 것과 비슷합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (91, "우리사주는 임직원들이 자기 회사 주식을 좋은 조건에 살 수 있도록 혜택을 주는 제도입니다.", "TRUE", "FALSE", "", "TRUE", "‘우리사주’는 말 그대로 우리 회사의 주식입니다. 임직원들이 자기 회사 주식을 좋은 조건에 살 수 있도록 혜택을 주는 제도예요. 우리나라에서는 기업이 상장하거나 유상증자를 할 때 새로 발행하는 주식 물량의 20%를 우리사주조합에 배정하게 돼 있습니다. 상장이나 유상증자 직후, 주가가 엄청나게 상승하면 주식을 팔아 수익을 내겠다고 생각할 수 있는데요, 이러기가 힘듭니다. 우리사주는 보호예수가 적용되기 때문에 일정 기간 처분할 수 없어요. 보호예수 기간이라도 우리사주를 처분하는 방법이 있습니다. 퇴사하는 건데요. 퇴사하면 주식이 한 달 후에 들어와서 처분할 수 있어요. 실제로 시세 차익을 위해 임직원이 사표를 내기도 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (92, "우선주는 특정 주식이 기록한 가장 높은 주가 중에서 해당 주식을 우선순위로 하는 +것을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "우선주는 보통주에 비해서 특정한 우선권을 부여한 주식입니다. 일반적으로 거래하는 ‘보통주’ 뒤에 ‘우’를 붙여서 표현해요. ‘삼성중공업’은 보통주, ‘삼성중공업우’는 우선주. 이런 식이에요. +\n우선주의 큰 특징은 1 보통주와 달리 주주총회에서 의결권을 행사할 수 없다, 2 그 대신 +보통주보다 배당수익률이 높다, 3 ‘일반적으로’ 보통주보다 주가가 40% 정도 낮고, 발행 주식 수가 적다는 점입니다. +\n이 중 3이 우선주의 괴리율을 크게 올려놓곤 합니다. 이슈가 생겼을 때 보통주보다 우선주에 수요가 몰리면서 거래량이 크게 늘고, 주가가 급등하는 식이에요. 우선주 급등 현상이 꾸준히 연출되자, 한 증권사 리포트에서는 ‘비정상의 구조화’라고 표현했어요.", "TF", 1000000, 100000, FALSE); + +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (93, "월세세액공제는 1년 동안 받은 총 급여액이 7천만 원 이하에 월세로 거주하면서, 세부 조건을 만족시키면 세액공제를 받을 수 있습니다.", "TRUE", "FALSE", "", "TRUE", "1년 동안 +받은 총 급여액이 7천만 원 이하에 월세로 거주하면서, 세부 조건을 만족시키면 월세액 세액공제를 +받을 수 있습니다. 세액공제 금액 예를 들어 볼게요. 총 급여액 3천만 원에, 매달 50만 원의 월세를 +낸 경우예요. 이 경우, 월세세액공제를 적용받아 월세의 1.5배 정도 되는 72만 원을 아낄 수 +있습니다. 월세세액공제를 받기 위해서는 무주택 세대주인지, 월셋집의 면적이 얼마나 되는지 등 조건을 따져봐야 해요. 조건에 맞으면 증빙서류를 준비해서 회사에 제출해야 합니다. 증빙 서류는 주민등록등본, +임대차 계약서 사본, 월세액 이체증(은행 등 금융기관에서 발급)이 있습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (94, "회사가 주식을 더 발행해 불특정 다수에게 파는 것을 '유상증자'라고 부릅니다.", "TRUE", "FALSE", "", "TRUE", "회사를 운영하다 보면 돈이 부족해질 때가 있습니다. 당장 사업을 유지하기에도 부족한 상황일 수도 있고, 사업을 좀 더 확장하기 위해 투자할 돈이 부족한 상황일 수도 있겠죠. 자금 조달 방법은 크게 두 가지입니다. 첫 번째 방법은 대출을 받는 거예요. 우리가 필요할 때 개인대출을 받는 것처럼, 기업도 기업대출로 돈을 끌어올 수 있습니다. 은행과 같은 금융회사를 매개로 하므로 ‘간접 금융’이라 불러요. 두 번째 방법은 기업이 직접 증권(채권, 주식)을 발행하는 ‘직접 금융’입니다. ‘지금 돈 빌려주면 나중에 이자 쳐서 갚을게~’ 약속하면서 채권을 발행하거나, 주식을 더 발행해 파는 방법이 있습니다. 이 중에서 후자를 ‘증자’라고 부릅니다. 일반적으로 증자라고 하면 유상증자를 말합니다. 회사가 돈이 필요할 때, 주식을 더 발행해 불특정 다수에게 파는 거예요. 대략 이런 시나리오예요. 회사마다 유상증자를 해야 하는 이유, 유상증자로 신주를 얻는 주체, 유상증자의 결과가 다 다르기 때문에 주주에게 호재일지, 악재일지는 잘 따져봐야 합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (95, "의무보유확약은 기업이 일정한 금액을 보유할 수 있는 의무적 기관을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "의무보유확약은 어떤 것을 ‘의무’적으로 ‘갖고 있도록’ ‘확’ 실하게 ‘약’속하는 것을 뜻합니다. 주식시장에서는 주식을 팔지 않고 보유하고 있겠다는 약속을 뜻해요. +\n기업이 상장하기 전, ‘수요예측’이라는 절차가 있어요. 은행이나 증권사, 보험사, 연기금 등 기관투자자를 통해 투자 수요를 예측하는 단계입니다. “우리 회사가 상장하면 한 주당 얼마에, 몇 주 살래?”하고 물어보는 과정이라 생각하면 돼요. +\n수요 예측이 끝나면 기업과 상장주관회사가 협의를 통해 공모주 가격을 결정합니다. 그리고 각 기관투자자에게 몇 주씩 줄지 ‘배정 물량’을 결정하게 돼요. +\n이때 각 기관투자자가 어떤 기업인지(투자성향, 공모주 참여실적 등), 공모주 가격을 얼마로 제시했는지, 의무보유기간은 얼마간으로 잡았는지 고려합니다.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (96, "이머징 마켓은 아직 선진국에 속하지 않은 국가들이 해외 자본에 시장을 열기 시작할 +때 사용되는 용어입니다.", "TRUE", "FALSE", "", "TRUE", "이머징마켓은 금융시장에서 자주 사용되는 용어예요. 아직 선진국은 아니지만 급격한 경제 발전과 함께 해외 자본에 시장을 열기 시작한 국가들을 ‘이머징마켓’이라고 부릅니다. 이머징마켓 투자는 고위험 고수익이라는 특징이 있어요. 우리나라는 아직 이머징마켓으로 분류되는데, 계속해서 선진국 시장에 편입되려고 노력하는 중이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (97, "일몰제는 일정 기간이 지나면 효력이 상실되는 제도를 뜻해요.", "TRUE", "FALSE", "", "TRUE", "일몰제는 해가 어느 시점에 지는 것처럼, 일정 기간이 지나면 효력이 상실되는 제도를 뜻해요. 일몰제로 효력이 상실될 시기가 다가올 때, 정부는 해당 제도의 일몰 시한을 연장하기도 합니다. 신용카드 등 사용금액에 대한 소득공제의 경우, 10번 가까이 기한이 연장됐어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (98, "임상시험은 신약 개발에 성공한 후 시판 허가를 받는 프로세스를 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "‘신약 개발에 성공했다’라는 건 임상시험 절차를 통과해 시판 허가를 받았다는 것을 뜻합니다. 여기서 시판 허가를 받기 전 단계를 크게 ‘전 임상시험’, ‘임상시험단계’로 나뉩니다. 그중에서도 임상시험단계는 총 3상으로 나뉘어요. 각 단계를 통과하는 데 시간이 오래 + +걸리고, 성공 확률도 높지 않아 도중에 실패하는 경우가 대부분입니다. 국내 제약업계에서 개발에 성공한 신약은 지난 25년간 약 30개뿐이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (99, "입법예고는 새로운 법령의 개정 또는 제정을 앞두고 있는 상황을 의미해요.", "TRUE", "FALSE", "", "TRUE", "정책 관련 뉴스를 볼 때는 ‘정책이 어떤 단계에서 논의되고 있는지’ 확인해야 합니다. +\n‘발의됐다’라고 하면 국회에서 어떤 정책의 필요성에 대한 이야기가 나왔다는 뜻입니다. +\n‘발의된 법안이 의결됐다’라고 하면 그 이야기대로 정책을 만들겠다는 뜻입니다. 실무 관련 구체적 내용은 정해지지 않은 단계예요. +\n법안이 의결되면 법제처로 넘어갑니다. 법제처는 정책을 어떻게 법으로 만들지 고민한 다음, 실생활에 적용하도록 법령을 만들어 ‘입법예고’를 해요. +\n즉, 발의-의결-입법예고가 모두 끝나야 하나의 법이 만들어집니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (100, "전후방산업은 최종 소비자에 가까운 산업으로 특정 용도가 있고, 자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업입니다.", "TRUE", "FALSE", "", "TRUE", "전후방산업 기업활동에서 부가가치가 생산되는 과정을 가치사슬이라고 해요. 땅 속에 묻혀 있던 철광석을 캐내서 철강으로 만들면 철광석으로 존재할 때보다 부가적인 가치가 더해지는 식입니다. 전방산업은 용도가 특정되며 최종 소비자에 가까운 산업이에요. 후방산업은 자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업입니다. 자동차 산업이 제조업의 꽃이라고 불리는 이유는 최종 전방산업으로서 후방산업과 연관효과가 무척 크기 때문이에요. 수많은 고용과 부가가치를 창출하는 산업이에요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (101, "조각투자는 실물을 쪼개 소액으로 투자하는 방식을 말합니다.", "TRUE", "FALSE", "", "TRUE", "실물을 쪼개 소액으로 투자하는 방식을 조각투자라고 해요. 가치 상승이 기대되는 자산의 소유권을 여러 명이 공동투자해 수익을 분배하는 투자 방식입니다. 투자 대상으로 부동산이나 저작권, 미술품은 물론 선박과 대출채권 등이 있습니다. 실물자산에 대한 일부 권리도 가질 수 있습니다. 실제 10억 원짜리 건물에 만 원을 투자한다면, 건물의 만 원어치 일부를 소유할 수 있습니다. 아주 소액이지만 건물주가 될 수 있는 셈이죠. 하지만 여전히 위험은 있습니다. 현물의 가치를 제대로 산정해야 하고, 중간에 사업자가 파산하거나 거래플랫폼이 도산하면 투자금을 날릴 수 있어요. 투자자 보호를 약관에 명시하는 등 믿을 만한 플랫폼을 골라야 하고, 내가 투자하려는 실물에 대한 지식이 어느 정도 요구됩니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (102, "주주는 주주총회에서 회사의 경영状況과 재무제표를 확인할 수 있다.", "TRUE", "FALSE", "", "TRUE", "주주총회는 주식회사의 주주가 모여서 회사의 중요한 사안을 결정하는 의사결정회의를 뜻합니다. +\n설명이 어렵지만, 학급 회의와 크게 다르지 않습니다. 학급과 관련된 주요 안건을 두고 찬반 투표를 하고 의견을 나눴던 것처럼 주주총회에서도 회사와 관련된 주요 안건을 의논해 결정해요. \n주식회사라면 매년 최소 한 번 이상 주주총회를 개최합니다. 회사는 매년 1년 동안의 사업을 결산해 ‘결산 재무제표’를 만드는데요. 주주가 이 재무제표를 승인해줘야 확정할 수 있거든요. 이외에도 회사와 관련된 중요한 사안들을 싹 모아서 ‘정기 주주총회’를 여는 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (103, "주택연금은 현재 거주 중인 집을 국가에 담보로 맡기고 매달 연금으로 일정한 금액을 평생 받을 수 있는 상품입니다.", "TRUE", "FALSE", "", "TRUE", "주택연금은 현재 거주 중인 집을 국가에 담보로 맡기고 매달 연금으로 일정한 금액을 평생 받을 수 있는 상품입니다. 월 지급액은 가입자의 연령, 주택의 시장 가격, 이자율 등을 고려해서 산정해요. 다른 조건이 동일할 때, 주택의 시장 가격이 높을수록 월 지급액이 높아져요. 주택연금은 2019년 가입연령이 60세에서 55세로 하향됐어요. 가입 가능한 주택 가격 요건도 ‘시가 9억 원 이하’에서 ‘공시지가 9억 원 이하’로 완화됐습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (104, "중간재는 생산 과정에 투입물로 사용하는 재화입니다.", "TRUE", "FALSE", "", "TRUE", "생산자가 생산 과정에 투입물로 사용하는 재화예요. 원자재와 다른 점은 중간과정에 + +사용하기 위해 한 번 가공을 거친 상태라는 점이에요. 예를 들어, 철광석은 원자재지만 철광석을 녹여 만든 철판은 중간재라고 할 수 있어요. 중간재는 상품을 만들 때 최종소비자가 사는 완성된 결과물과도 다릅니다. 중간재인 철판은 최종소비자가 사용하기 어렵고, 자동차나 배를 생산하는 기업이 구매해 사용해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (105, "'잔존가치'는 자산의 내용연수가 끝날 때의 시장가치를 말합니다.", "TRUE", "FALSE", "", "TRUE", "누군가 사용하던 중고 물품을 정가와 동일한 가격에 구매하는 사람은 드물 거예요. 사려는 사람은 많은데 공급은 적어 프리미엄이 붙는 특수한 경우를 제외하면, 대부분의 상품은 개봉과 동시에 정가보다 낮은 가격에 거래됩니다. 심지어 포장을 뜯지 않았다고 해도 원래 가격보다는 낮은 가격에 거래되기 마련이죠. 누구나 새 걸 좋아하니까 생기는 일이에요중고 거래 가격은 소비자의 선호 체계를 고스란히 반영합니다. 구체적으로 세 가지 이유로 설명할 수 있습니다. +\n효용 극대화: 새 상품 구매가 훨씬 더 기분 좋아요. ‘새 상품을 샀을 때보다 덜 좋은 기분’이 중고 거래가에 반영돼요. +\n정보의 비대칭성: 내가 알지 못하는 다른 사람의 손에 들어갔던 물건은 어떻게 다뤄지고 변화했는지 알 길이 없습니다. 이전 소유자가 기업이나 판매자보다 깔끔하게 상품을 관리할 가능성은 아주 적어요. ‘불확실성 감당 비용’이 중고 거래가에 반영됩니다. +\n손실 회피: 중고 제품은 환불이나 A/S 등 그 상품을 제조하고 판매한 기업의 서비스 제공 범위에서 벗어나 있을 가능성이 큽니다. 잠재적인 문제 발생 가능성도 중고 거래가격 책정에 반영됩니다. +\n이런 경향을 한마디에 눌러 담은 것이 바로 감가상각이에요.", "TF", 1000000, 100000, +FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (106, "중립금리는 이론적으로 경제가 인플레이션(물가 상승)이나 디플레이션(경기 침체) 압력이 없는 잠재성장률 수준을 유지하게 만드는 이론적인 금리 수준입니다.", "TRUE", "FALSE", +"", "TRUE", "중립금리는 이론적으로 경제가 인플레이션(물가 상승)이나 디플레이션(경기 침체) +압력이 없는 잠재성장률 수준을 유지하게 만드는 이론적인 금리 수준이에요. 금리가 너무 높지도, +낮지도 않은 것을 뜻하죠. 중립금리는 절대적으로 정해진 수치가 아니라 그때그때 경제 상황에 따라 달라져요. 경제가 완전고용 상태이고 물가수준이 안정적인 상태에서 돈의 수요와 공급이 균형을 이뤄야 하니까요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (107, "지역화폐는 일반적으로 사용하는 화폐와 달라요.", "TRUE", "FALSE", "", +"TRUE", "지역화폐는 백화점 상품권과 같은 일종의 ‘유가증권’입니다. 현금처럼 사용할 수 있는 결제수단 중 하나지만, 일반적으로 사용하는 화폐와는 달라요. 우리가 흔히 쓰는 1천 원, 1만 원 권과 같은 화폐는 한국은행이 발행하는 한국은행권입니다. 국가에서 법으로 공식 인정한 화폐인 +한국은행권과는 다르게, 지역화폐는 지자체에서 마련한 조례에 따라 발행, 유통되기 때문에 조례에서 허용하는 범위 내에서만 사용할 수 있어요. 주로 지역상권 활성화, 지역 공동체 강화를 위한 목적으로 활용되고 특정 지역 내에서 제한된 구성원끼리 사용할 수 있습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (108, "챗GPT는 마이크로소프트사가 12조 원을 투자하여 만든 생성형 인공지능(AI)입니다.", +"TRUE", "FALSE", "", "TRUE", "챗GPT는 미국 인공지능연구소 OpenAI가 만든 생성형 인공지능 (AI)입니다. 마이크로소프트사가 12조 원을 투자했어요. 우리가 질문을 하면 온라인에 있는 정보를 갖고 알맞은 콘텐츠를 만들어요. +\n챗GPT 같은 생성형 AI는 어마어마한 빅데이터를 순식간에 처리해야 해요. 현재 반도체 구조로는 전력을 크게 잡아먹고, 비용도 많이 듭니다. 2023년 상반기 기준, 한 달에 1조 9천억 원의 운영비가 든다고 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (109, "최저임금은 기업이 직원에게 최소적으로 지불해야 하는 임금을 말해요.", "TRUE", "FALSE", "", "TRUE", "최저임금은 최저임금위원회의 논의 및 의결을 통해 결정됩니다. 매년 4 월경에 논의를 시작해 6월 말~7월 초·중순에 합의된 안을 발표하곤 해요. +\n구체적으로는 ‘고용노동부 장관이 최저임금위원회에 최저임금을 심의 및 의결하는 것을 요청한 시점’ 을 기준으로 90일 이내에 결정해야 돼요. +\n고용노동부 장관은 매년 3월 31일에 심의를 요청하고 있습니다. 그래서 원칙적으로는 6월 말까지 의결이 완료되어야 하지만, 경영계와 노동계의 입장이 좁혀지지 않으면 7월까지 넘어가기도 해요. \n최저임금위원회가 내년도 최저임금에 대해 결론을 내리고 나면, 고용노동부 장관이 8월 5일까지 + +결정된 내용을 발표합니다. 이때 고시된 최저임금의 효력이 다음 해 1월 1일부터 발생해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (110, "추가경정예산안은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하는 것이다.", "TRUE", "FALSE", "", "TRUE", "추경은 ‘ 추가경정예산’의 줄임말이고, 경정(更正)은 ‘바르게 고친다’라는 뜻이에요. 추가경정예산은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하죠. 연초에 세운 계획보다 돈을 더 쓰겠다는 건데요. 추경안은 자연재해나 큰 사고가 나서 인프라와 사회를 복구해야 할 때 나옵니다. 그래서 지난 추경안 규모를 보면 굵직한 경제적 충격들을 읽을 수 있어요. 추경 규모가 10조 원을 넘는 곳(빨간색 그래프)은 리먼브라더스 사태가 촉발한 세계 금융위기, 브렉시트 등 우리나라뿐만 아니라 세계적인 경제 위기가 있었던 시기입니다. 그중에서도 2020년과 2021년의 추경 횟수와 금액은 ‘역대급’이니, 코로나19가 세계적으로 얼마나 커다란 경제적 충격을 가져왔는지 알 수 있어요. 사실 추경 자체가 엄청나게 특별한 일은 아닙니다. 우리나라뿐만 아니라 전 세계 국가 대부분이 매년 추경을 실시합니다. 돈 쓸 일이 너무 많다 보니 1년 동안 얼마가 필요할지 정확하게 예측하기가 어렵거든요. 돌발사태가 발생하기도 하고요. 국가가 사업을 집행하는 데는 국민의 세금이 사용됩니다. 그래서 국민의 대리인인 국회의원과 정당이 추가예산이 필요하다는 행정부를 상대로 견제하기 시작합니다. ‘추경을 하느냐, 마느냐’보다는 추경 횟수와 액수 등을 두고 다투죠. 일명 ‘ 감액심사’라고 해요. 정치적 이해관계에 따라 여당이 행정부 편을 많이 들어주기도 하는데요. 보통 매년 추경을 하기 때문에 ‘필요하다’라는 쪽으로 결론이 나긴 합니다. 하지만 모든 추경안이 실행되는 건 아니에요. 예를 들어 어떤 정당이 추경을 해야할 만큼 꼭 필요한 사업이라고 생각하지 않고, 이들의 주장이 국회 다수결로 지지를 받는다면 추경안은 실행되지 않습니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (111, "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장이 잠시 멈출 때를 ‘캐즘’이라고 합니다.", "TRUE", "FALSE", "", "TRUE", "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장이 잠시 멈추는 구간을 ‘캐즘(Chasm)’이라고 해요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (112, "코스피는 어떤 지표를 나타내나요?", "TRUE", "FALSE", "", "TRUE", " 금융시장에서 ‘인덱스’는 ‘지수’를 뜻합니다. 여기서 ‘지수’는 IQ지수, BMI지수, 행복지수, 빅맥지수에 등장하는 것과 같은 개념이에요. ‘주가지수’는 주식의 가격을 ‘지수화’한 걸 의미하죠. \n우리나라 대표 주식시장인 유가증권시장에서는 유가증권시장은 ‘(현재 시점에서, 주식시장에 상장된 기업의 시가총액을 모두 합친 것) ÷ (과거의 특정 시점에서, 상장된 모든 기업의 시가총액을 모두 합친 것) x 100’으로 지수를 산출합니다. +\n‘과거의 특정 시점’은 고정돼있습니다. 유가증권시장은 1980년 1월 4일이 기준이에요. 이렇게 1980년 1월 4일과 현재를 비교하는 지수화 작업을 통해 산출한 숫자를 한국종합주가지수(KOrea Composite Stock Price Index)라고 부릅니다. 약자인 KOSPI, 코스피가 더 익숙할 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (113, "코스피200는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가를 말하지 않습니다.", "TRUE", "FALSE", "", "FALSE", "코스피200은 유가증권시장에 상장된 기업 중, 시가총액 등을 기준으로 상위 200개 기업의 주식을 지수화한 것을 뜻합니다. +\n유가증권시장에 상장된 모든 기업의 주식을 지수화한 KOrea Composite Stock Price Index( 한국종합주가지수), 즉 KOSPI와는 다른 지수예요. 일종의 우등생 클럽이라고 보면 됩니다. +\n한 국가의 대표 지수에 새롭게 편입되는 일은 기업에 큰 호재입니다. 국내외 투자자들이 많이 참고하는 지표인데다, 지수의 움직임을 따르는 펀드의 규모도 상당하거든요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (114, "퀵커머스는 온라인 커머스 시장에서 새로운 배송 서비스 형태를 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "퀵커머스는 ‘퀵’(Quick)과 상거래 ‘커머스’(Commerce)의 합성어입니다. 음식 배달을 넘어 화장품이나 책, 약 등 다양한 제품을 1시간 안에 배송하는 서비스를 뜻해요. 온라인 커머스 시장의 당일배송이나 새벽배송보다 한 단계 진화된 형태예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, + +option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (115, "킹달러가 있는 경우, 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있습니다.", "TRUE", "FALSE", "", "TRUE", "달러 가치 초강세 현상을 뜻합니다. +2022년 미국 달러 가치는 20년만에 최고 수준으로 올랐는데, 미국 연방준비제도(연준)가 +인플레이션을 잡기 위해 금리를 급격하게 올렸기 때문이에요. 통화 가치가 높다면 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있어요. 반대로, 다른 나라의 통화 가치가 높아지면 환전할 때 우리나라 입장에서는 그 나라의 통화가 비싸지게 됩니다. 값비싼 통화를 사야 하니까요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (116, "타임래그(time-lag)는 어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상입니다.", "TRUE", "FALSE", "", "TRUE", "타임래그(time-lag)는 우리나라 말로는 ‘시간차’입니다. 어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상을 뜻해요. 경제학에서도 타임래그 현상을 종종 볼 수 있어요. 예를 들어, 기준금리를 낮추기로 결정한 뒤, 시장에 유동성이 풍부해지며 경기가 활성화되고 물가가 오르는 것도 시간차를 두고 발생하는 식이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (117, "테슬라요건은 특정 주식이 지난 몇 년간 기록한 가장 높은 주가이거나 이익을 +의미하는 것입니다.", "TRUE", "FALSE", "", "FALSE", "테슬라 요건의 정식 명칭은 ‘이익 미실현 기업 특례 상장’이에요. +\n테슬라 요건은 상장 요건에 미달하더라도 성장성이 높은 기업이 상장할 수 있도록 만든 특례 제도입니다. +\n미국 기업 ‘테슬라’가 적자였음에도 나스닥에 상장한 후 크게 발전한 사례에서 따와 ‘테슬라 요건’ 이라는 이름이 붙었습니다. +\n우리나라는 2017년부터 테슬라 요건을 적용하고 있어요. +\n국내에서 테슬라 요건으로 최초 상장한 기업은 온라인 상거래 플랫폼 사업을 영위하는 카페24예요.", +"TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (118, "티커는 특정 주식의(stock's) 등급이나 코드를 말해요.", "TRUE", "FALSE", "", "TRUE", "국내 주식을 할 때는 특정 주식을 검색할 때 ‘종목명’이나 ‘종목코드’ 6자리를 입력해요. \n미국 주식시장은 조금 다릅니다. 종목코드가 대문자 알파벳으로 돼 있거든요. 정식 명칭은 ‘티커 (ticker)’입니다. +\n티커로 주식이 어느 주식시장에 상장했는지도 구분할 수 있습니다. 뉴욕증권거래소에 상장된 종목은 주로 3자리 이내, 나스닥에 상장된 종목은 5자리 이내의 알파벳으로 티커를 정합니다. 테슬라는 +TSLA, 애플은 AAPL이 티커예요. 둘 다 나스닥에 상장된 기업이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (119, "파운드리는 반도체 기업이 설계도를 받아 주문 들어온 만큼만 반도체를 가공, 위탁 생산하는 것이다.", "TRUE", "FALSE", "", "TRUE", "반도체 기업은 크게 세 종류로 나뉩니다. 이중, 파운드리는 팹리스의 설계도를 받아다 주문 들어온 만큼만 반도체를 가공, 위탁 생산하는 기업이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (120, "페트로 달러 체제는 1975년부터 원유 대금을 미국 달러로만 결제하도록 한 시스템입니다.", "TRUE", "FALSE", "", "TRUE", "페트로 달러 체제는 1975년부터 원유 대금을 미국 달러로만 결제하도록 한 시스템으로 미국 달러를 세계 기축통화로 만든 원동력이에요. 페트로 달러 체제는 미국이 사우디 왕실에 전한 은밀한 제안에서 시작했어요. 1975년, 미국은 사우디에 ‘중동 맹주국 지위를 보장할 테니 원유 결제엔 달러화만 쓰라’고 제안했고, 사우디가 받아들였습니다. 이후로 미국은 사우디아라비아의 든든한 우방국으로 자리 잡았어요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (121, "포괄임금제는 근로계약을 할 때 연장·야간·휴일근무를 하는 것으로 가정하고 연봉에 관련 수당을 포함하는 임금 산정 방식입니다.", "TRUE", "FALSE", "", "TRUE", "포괄임금제는 근로계약을 할 때 연장·야간·휴일근무를 하는 것으로 가정하고 연봉에 관련 수당을 포함하는 임금 산정 방식입니다. 근로시간을 엄격하게 통제하기 힘든 시스템이나 선택적 근무제 등 비교적 자유로운 근무 문화를 가진 회사의 경우 포괄임금제로 연봉을 산정하는 경우가 많아요.", "TF", 1000000, 100000, + +FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (122, "프로젝트 파이낸싱(PF)은 특수목적법인(SPC)을 설립하여 해당 사업 자체를 담보로 +잡아 돈을 빌리는 방식입니다.", "TRUE", "FALSE", "", "TRUE", "PF는 프로젝트 파이낸싱의 약자예요. 건설 등 특정 사업을 프로젝트로 진행할 때 이 사업만 담당하는 특수목적법인(SPC)을 세우고, +해당 사업 자체를 담보로 잡아 돈을 빌립니다. 만약 공장 건설 프로젝트를 PF로 진행한다고 하면 이 공장이 앞으로 물건을 생산·판매해 들어올 수익까지도 계산해서 대출을 받을 수 있습니다. 리스크가 상당히 큰 대출 방식이에요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (123, "필립스곡선은 인플레이션과 실업률 사이에 직접적인 관계가 있다는 경제학 모형입니다.", "TRUE", "FALSE", "", "FALSE", "필립스곡선은 실업률과 인플레이션(물가 상승) 사이 반비례 관계가 있다는 경제학 모형이에요. 여기서 인플레이션은 임금상승률(명목)로 나타냅니다.", +"TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (124, "하드 블록 전략을 사용하면 비수기에는 시세보다 다소 비싸게 대량구매를 해두는 것은?", "TRUE", "FALSE", "", "TRUE", "여행사가 여행 패키지 상품 구성을 위해 미리 사둔 항공권이에요. 하드 블록 전략을 이용하면 비수기에는 시세보다 다소 비싸게 대량구매를 해두고, 성수기에는 시세보다 저렴하게 대량구매를 해두어 안정적인 여행객 수요 대응을 할 수 있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (125, "한미 금리역전은 미국의 기준금리가 한국보다 낮아진 것을 뜻합니다.", "TRUE", "FALSE", "", "FALSE", " 한미 금리역전은 미국의 기준금리가 한국보다 높아진 것을 뜻해요. 보통 국가의 신용도가 높을수록 기준금리가 상대적으로 낮아요. 예를 들어 경제규모 세계 1위이자 기축통화국인 미국은 다른 개발도상국보다 낮은 금리를 유지하죠. 우리나라도 보통 미국보다 기준금리가 높고요. 기준금리가 낮다는 건, 해당 국가의 돈값(이자)을 매기는 기준이 다른 국가보다 낮다고 해석할 수 있는데요. 투자자 입장에서는 같은 돈을 미국 달러에 투자했을 때 받는 돈값이 적더라도, 달러를 매력적으로 느낍니다. 신용도가 높고 경제력이 탄탄해 안전하니까요. 미국보다 상대적으로 금리가 높은 우리나라와 같은 국가도 다른 의미로 매력적인 투자처예요. 상대적으로 높은 금리, 즉 높은 수익률을 제공하기 때문이에요. 그런데 미국이 인플레이션을 해소하기 위해 기준금리를 올리면서, 우리나라보다 돈값을 높게 쳐주기 시작했어요. 안전한데다 금리까지 높다면? 우리나라 금융시장에 투자하던 외국인 투자자들이 돈을 빼서 미국으로 향할 수도 있어요. 물론 그렇지 않았던 사례도 있었지만, 한국과 미국의 금리가 역전되면 대책이 필요하다는 얘기가 나오곤 해요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (126, "한한령은 중국 정부가 우리나라의 사드 배치 발표로 내린 금지령입니다.", "TRUE", "FALSE", "", "TRUE", "지난 2016년, 우리나라의 사드 배치 발표로 중국 정부는 ‘한한령(중국 내 한류 금지령)’을 내립니다. 중국인 관광객들의 우리나라 방문을 통제하거나 우리나라 상품 수입을 규제하는 등 다양한 방식으로 압박해왔어요. 콘텐츠 전반에 한한령이 적용되면서 국내 게임업체도 시련을 겪었어요. 중국에 게임을 서비스하고 수익활동을 하기 위해서는 ‘외자판호’가 반드시 필요한데, 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임업체의 매출 중 큰 부분이 중화권 매출이었습니다. 그런데 진출 자체가 막혀버렸으니 엄청난 악재가 될 수밖에 없었어요. 이후 국내 콘텐츠 전반에 적용되던 한한령이 하나둘 풀리기 시작했지만 유독 게임 분야는 규제가 풀리는 속도가 느렸어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (127, "할증은 택시 또는 고속버스를 이용할 때 기존 요금에 얼마를 더한 금액을 적용하는 것입니다.", "TRUE", "FALSE", "", "TRUE", "나눌 ‘할(割)’, 더할 ‘증(增)’을 합친 한자어예요. 일정 기준에 얼마를 더한다는 뜻으로, 영어로는 ‘extra charge’로 번역할 수 있어요. 보통 아래와 같은 상황에서 사용됩니다. 심야 할증: 심야에 택시 또는 고속버스를 이용할 때, 기존 요금에 얼마를 더한 금액을 적용하는 것", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (128, "행동주의펀드는 기업의 경영에 적극적으로 참여하는 투자전략을 갖고 있는 펀드를 말합니다.", "TRUE", "FALSE", "", "TRUE", "행동주의펀드는 헤지펀드 중에서도 기업 의결권을 + +확보할 수 있을 만큼 투자해 기업의 경영에 적극적으로 참여하는 투자전략을 갖고 있는 펀드를 뜻합니다. 행동주의펀드 역시 최대 이익을 추구합니다. 기업의 자산을 매각해 현금흐름을 개선하고 주주배당을 +확대하며, 구조조정을 통해 핵심 자산 가치를 불리는 방식을 요구하기도 해요. 행동주의펀드는 기업의 군살을 없애고 주주의 권리를 올리며 기업 수익을 극대화한다는 장점을 갖고 있지만, 기업의 단기적 수익에 집착하다가 본질을 해치고 ‘먹튀’한다는 비판을 동시에 받곤 합니다.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (129, "행복주택은 특정 주택이 일정한 기준을 충족하여 주민들에게 제공하는 주택으로 정의된다.", "TRUE", "FALSE", "", "TRUE", "행복주택은 대학생, 사회초년생, 신혼부부, 고령자 등을 위해 LH가 새로 건설해 공급하는 공공임대주택을 말합니다. +\n특징: 행복주택은 직장과 학교와 가까운 곳(직주근접)이거나 대중교통 이용이 편리한 곳에 위치하고, 주변에 다양한 주민 편의시설을 함께 짓는다고 해요. +\n임대료: 행복주택에도 여러 가지 유형이 있는데요, 유형별 입주자격과 소득·자산기준을 충족할 경우 주변시세 대비 60~80% 저렴한 임대조건으로 입주할 수 있어요. +\n기간: 행복주택의 총 임대기간은 대학생·청년 6년, 유자녀 신혼부부 10년, 고령자·수급자 20 +년으로 설정돼있어요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (130, "환차손은 기업이 외국에서 취급하는 бізнес을 하다가 환율이 내려가면 발생하는 손해를 말합니다.", "TRUE", "FALSE", "", "TRUE", "‘환차손’은 환율 변동에 따른 손해를 뜻합니다. 반대말은 ‘환차익’이에요. +\n1,200원을 1달러로 바꾼 그 시점에는 환차손이나 환차익이 발생하지 않아요. +\n1,200원 주고 산 1달러를 다시 우리나라 돈으로 바꿔야 할 때 환율이 변동해 1,000원을 받게 되면 200원의 환차손이 발생하는 거죠. +\n200원은 투자원금 1,000원 기준 20%나 된답니다. 다시 말해, 1달러에 1,200원에서 1,000원이 됐을 때 기준 미국 증시에서 번 돈을 환전해서 실질적인 수익이 나는 시점은 수익률 21%부터인 거예요.", "TF", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (131, "은행 외에는 고금리의 사금융밖에 선택지가 없던 시기에 정부가 만들었다는 금융기관의 유형은?", "2금융권", "상호신용금고법", "사금융", "1금융권", "은행 외에는 고금리의 사금융밖에 선택지가 없던 1970년대, 정부에서 ‘상호신용금고법’을 만들어 사금융을 양성화하기 시작했습니다. 이때부터 나타난 회사들은 특정 그룹이나 분야에 전문성을 가진 회사였습니다. 이렇게 새로운 금융회사들이 만들어지던 시기에, 은행과 은행이 아닌 금융회사를 구별해서 부르기 시작했습니다. 예전부터 있었던 은행을 1금융권으로, ‘은행이 아닌’ 금융회사를 2금융권으로 부르게 된 거죠. 1 금융권인 은행과 2금융권에 속해있는 저축은행의 경우, 예금과 대출을 해준다는 측면에서 비슷한 +기능을 하기 때문에 소비자 입장에서는 같은 선상에 두고 비교해볼 만합니다.안정성이 높지만 수익률( 이자율)이 낮은 1금융권 예금을 택할지, 대출금리가 높지만 대출받기가 더 쉬운 2금융권 대출을 +택할지 비교해보는 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (132, "여러 번 사용이 가능한 전지를 말할 때 사용하는 용어는?", "1차전지", "3차전지", "2차전지", "2차전지", "2차전지는 충전과 방전을 통해 여러 번 사용이 가능한 전지예요. 대표적인 2차전지로는 휴대폰 배터리가 있습니다. 종류는 납 축전지, 니켈카드뮴 전지, 니켈수소 전지, 리튬이온 전지 등이 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (133, "특정 주식의 52주 신고가는 무엇입니까?", "주식시장", "52주 신고가", "주식가격", +"52주 신고가", "52주 신고가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 높은 주가를 말해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (134, "주식의 가장 낮은 주가를 의미하는 단어는?", "최고가", "52주 신저가", "시가", "52주 신저가", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (135, "금융뉴스에서 자주 언급되는 ‘만분율’ 단위의 움직임을 표현하는 약자는?", " + +퍼센트포인트", "베이시스포인트", "금리점수", "베이시스포인트", "기준금리 뉴스에 자주 등장하는 ‘bp’는 ‘basis point’의 약자예요. 금융에서 쓰이는 기본단위로, 금리나 수익률, 환율을 나타낼 때 사용합니다. 일반적으로 사용하는 백분율이 아닌 ‘만분율’ 단위의 움직임을 표현하는데요. 1bp는 0.01%p, 10bp는 0.1%p, 100bp는 1%p예요. 금융시장에서는 0.01%p의 움직임도 영향력이 커요. 그래서 0.01%p도 뉴스에 자주 언급됩니다. 백분율을 기준으로 ‘퍼센트포인트’라고 말하는 것보다 만분율을 기준으로 bp로 나타내는 것이 정보전달에 더 효율적이라서 사용한다는 얘기가 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (136, "내 소득 대비 금융부채 원리금 상환비율을 나타내는 단어는?", "LDR", "DSR", "CPR", "DSR", "DSR(Debt Service Ratio)은 내 소득 대비 금융부채 원리금 상환비율이에요. DSR 40%라면 내 연 소득이 1억 원일 때, 1년 동안의 원금과 이자 상환비율이 4천만 원을 넘지 않는 정도까지 대출을 해준다는 뜻이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (137, "소득 대비 금융비용 부담률을 나타내는 지표는?", "DSR", "DTI", "CPI", "DTI", "DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. DTI는 ‘나의 연소득’에서 ‘주택담보대출의 원금 상환과 이자, 다른 대출의 이자로 나가는 금액’이 차지하는 비중으로 구합니다. 내가 가진 모든 대출의 원리금 상환금액을 합쳐 따지는 DSR보다는 유한 기준입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (138, "환경, 사회, 회사의 가치를 고려한 투자 방식을 뜻하는 단어는?", "이자율", "ESG", "P/E비", "ESG", "ESG는 Environmental(환경), Social(사회), Governance(지배구조)의 첫 글자를 조합한 단어로 기업의 친환경 경영, 사회적 책임, 투명한 지배구조 등을 의미합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (139, "증거금리를 따라 가는 인자펀드를 뜻하는 단어는?", "펀드", "ETF", "인덱스펀드", +"ETF", "ETF(Exchange Traded Fund)는 말 그대로 인덱스펀드를 거래소에 상장시켜 투자자들이 주식처럼 편리하게 거래할 수 있도록 만든 상품입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (140, "G7의 약자로 불리는 회담이 열리는 7개국의 이름은 무엇입니까?", "중국, 러시아, 인도", "미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본", "유럽 연합, 아시아권, 미국", "미국, +캐나다, 영국, 독일, 프랑스, 이탈리아, 일본", "G7. Group of Seven Summit. 주요 7개국 정상회담의 약자입니다. 미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본 7개국은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최해요. 이 회담뿐만 아니라 이 회담에 참여하는 7개국을 G7이라고 줄여 부르기도 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (141, "GNI와 유사한 지표는 무엇입니까?", "GNP", "GDP", "CPI", "GDP", "GNI는 Gross National Income의 약자로, ‘국민총소득’입니다. GNI는 일정 기간 내 ‘우리나라 국적을 +가진 사람’이 벌어들인 모든 소득을 더한 거예요. 우리나라에 거주하고 있는 외국인의 소득은 제외하고, +외국에 거주하는 우리나라 국민의 소득을 포함해요. GNI를 구하는 가장 큰 이유는 국가가 아니라 국민들의 생활 수준을 알아보기 위해서예요. GNI와 유사한 지표로는 GDP가 있어요. GDP는 ‘한 국가에서 생산된 모든 부가가치의 총합’으로 국가 경제의 규모를 나타내죠. 위의 그림으로 이해하자면 사과는 부가가치, 사과박스는 국가의 영토, 과수원은 부가가치를 창출하는 국민ᆞ회사를 뜻해요. A 국적을 가진 국민ᆞ회사(과수원)가 전 세계에서 부가가치(사과)를 창출하는 상황을 가정해볼게요. GDP 는 사과 박스에 사과가 얼마나 들었는지를 보는 것과 비슷합니다. 사과가 많이 든 박스가 경제력이 큰 국가라고 볼 수 있고요. GNI는 과수원에서 나오는 사과들의 총합이라고 볼 수 있어요. 생산량이 많은 과수원이 GNI가 큰 국가예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (142, "전 세계 자원이 거쳐가는 글로벌 생산기지를 나타내는 비율은?", "국제 무역액", "GVC 후방참여율", "수출입 지수가", "GVC 후방참여율", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 비율을 말해요. 이 수치가 높은 나라일수록 전 세계 자원이 거쳐가는 글로벌 생산기지라 할 수 있어요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, + +option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (143, "LTV는 주택담보대출에서 계산하는 비율은 무엇입니까?", "총부채상환비율", " 주택담보대출비율", "대출가능금액지표", "주택담보대출비율", "LTV는 주택담보대출비율(Loan to Value ratio)입니다. 공식은 ‘(대출한 금액) / (아파트 가치)*100’이에요. 즉, 총 아파트 가치에 비교한 대출금의 비중을 보여줘요. LTV는 주택담보대출의 대출가능금액을 산출할 때 사용돼요. LTV 기준비율은 지역에 따라 다른데요. 평균 40~70% 수준입니다. DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. LTV로는 대출받을 수 있는 최대금액을 계산하면 되고, DTI로는 대출 받고자 하는 금액이 소득 수준과 비교해서 적합한지 확인할 수 있습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (144, "회사 규모를 키우거나 시장에서 경쟁력을 키우는 것을 목표로 하는 조직간의 통합을 뜻하는 단어는?", "경영제안", "M&A", "합병", "M&A", "기업이 다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념이에요. M&A는 ‘Merger( 합병)&Accquisition(인수)’의 약자로, 인수&합병 순서가 반대예요. 인수와 합병 안에서도 어디까지 인수하고, 어떻게 합병하느냐에 따라 세부적인 종류가 나뉩니다. 기본적인 목적은 회사 규모를 키우거나 시장에서 빠르게 경쟁력을 키우는 것이에요. 예를 들어 더 작은 회사의 기술이 지속적으로 필요할 때, 비슷한 업계에서 비슷한 일을 하고 있는 몇 개의 회사가 합쳐져 큰 회사가 되려고 할 때 M&A를 할 수 있습니다. 이 과정이 기존 경영진이나 기존 주주들의 합의에 의해 이뤄지면 우호적 M&A, 기존 경영진이나 주주의 의사와는 관계없이 경영 환경 등에 의해 이뤄지면 적대적 M&A라고 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (145, "제조업 구매관리자지수(PMI)’는 다음과 같은 의미를 지니게 하는 지표예요.", " 고용율지표", "제조업 구매관리자지수(PMI)", "기업경기실사지수(BSI)", "경기동향지표", "‘ISM 제조업 구매관리자지수(The ISM manufacturing Index)’는 생산 관련 지수예요. ‘PMI 지수’라고도 불러요. PMI 지수는 미국의 민간 경제단체인 공급관리협회(The Institute of Supply Management) 에서 매달 19종 400개 이상의 전·후방 제조업 구매담당자에게 설문을 돌려 만드는 경기동향지표입니다. +제조업 실무자에게 재고 수준이나 신규 주문량, 고용 상황 등은 어떻게 되어가고 있는지 등 현재 업황을 물어보기 때문에 업계 전망을 직접적으로 파악할 수 있어요. 우리나라로 치면 한국은행이 조사하는 ‘기업경기실사지수(BSI)’와 비슷해요. PMI 지수는 매월 첫 영업일에 발표됩니다. 다른 거시경제 지표보다 일찍 발표되면서도 이후 발표될 거시경제 지표와 큰 차이가 날 리는 없으니, 이번 달 경기 움직임을 미리 보여주는 지표라고 할 수 있어요. PMI 지수는 0부터 100 사이에서 수치가 결정됩니다. 50을 기준으로 해서 50보다 낮으면 제조업경기가 전보다 수축되었다고 볼 수 있고, 50 보다 높으면 제조업경기가 전보다 확장되어 간다고 해석해요. 절대적으로 좋다, 나쁘다라고 해석하기보다는 ‘전월 대비 이번 달은 어떤지’에 대한 추세가 중요한 지표입니다. 만약 PMI 지수가 좋게 나오면 미국 증시뿐만 아니라 우리나라 증시도 분위기가 좋아질 수 있습니다. 미국의 제조업 업황이 좋으면 우리나라의 수출도 늘어나기 때문이에요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (146, "나의 소득에서 세금이나 보험료를 제외한 실제로 쓸 수 있는 돈은?", "예금", " 가처분소득", "예산", "가처분소득", "가처분소득은 내가 번 소득 중 소비와 저축으로 쓸 수 있는 돈을 뜻해요. 구체적으로는 내가 번 돈에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다. 소득 분위에 따라 실제로 사람들의 소득수준이 어떤지 볼 수 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (147, "회사의 재무제표를 확인하고 의견을 표명하는 보고서는?", "재무제표", "감사보고서", +"경영보고서", "감사보고서", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다. 감사보고서 의견은 ‘적정’, ‘부적정’, ‘한정’, ‘의견거절’ 총 네 가지예요. 이 중 ‘적정’을 제외한 ‘부적정’, ‘한정’, ‘의견거절’은 ‘비적정’에 해당돼요. 코스닥 상장기업이 ‘비적정(부적정, 한정, 의견거절)’ 의견을 받으면 바로 상장폐지 사유가 발생합니다. 코스피 상장사의 경우 ‘부적정’ 또는 ‘의견거절’을 받거나 ‘한정’을 2년 연속 받으면 상장폐지 사유가 발생합니다. 감사보고서 제출 기한을 앞두고 기업도, 주주도 예민해지곤 합니다. 상장폐지 사유가 발생하면, 그 사유가 해소될 때까지 주식 거래가 정지되거든요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (148, "economy에서 개인이 직접적으로 사용하는 물품과 서비스의 총액을 나타내는 것은?", + +"고용", "개인소비지출 (PCE)", "생산", "개인소비지출 (PCE)", "개인소비지출(Personal Consumption Expenditures, PCE)은 가계가 재화와 서비스를 구매하는 데 사용하는 지출을 의미합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (149, "주식시장에서 주식을 사고 팔 때의 총 금액을 나타내는 지표는?", "주가", " 거래대금", "투자수익", "거래대금", "거래대금은 주식이 사고 팔린 총 금액입니다. 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다. 거래대금이 크다는 것은 그만큼 거래량이 많다는 뜻이에요. 거래량과 거래대금은 주가지수와 함께 주식시장의 경기를 판단하는 중요한 자료로 활용되고 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (150, "경기순환사이클의 가장 큰 구분은?", "회복기와 활황기", "회복기-활황기-후퇴기- 침체기", "회복기, 후퇴기, 침체기", "회복기-활황기-후퇴기-침체기", "경기가 일정 주기를 두고 상승과 하락을 반복하는 현상을 경기순환이라고 합니다. 크게, 회복기-활황기-후퇴기-침체기가 돌고 돌아요. 경기순환의 전반적인 흐름을 파악하면 투자 전략을 짜는 데 도움이 될 수 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (151, "우리나라와 외국 사이의 상품·서비스의 수출입을 기록한 장부는?", "국제수지", " 경상수지", "무역장부", "경상수지", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동·자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부라고 할 수 있어요. 경상수지는 ‘국제수지’라는 지표의 일부분입니다. 국제수지는 우리나라가 다른 국가들과 서로 거래한 내역을 기록한 회계장부라고 생각하시면 돼요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (152, "경기가 호황으로 잘 나가다가 갑자기 실업자와 자산 가치 폭락을 겪는 경우를 뜻하는 단어는?", "연착륙", "경착륙", "덤핑", "경착륙", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 주식, 부동산 등 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 자본주의 경제 시스템에서는 호황과 불황이 주기적으로 찾아옵니다. 불황이 왔을 때 부작용을 최소화하며 경기 침체에 대응한다면 연착륙이라고 하고, 대응에 실패해 우당탕 급락과 폭락을 하게 된다면 경착륙이라고 해요. 경착륙은 원래 항공용어로, 비행기 구조가 손상될 정도로 거칠게 착륙하는 행위를 말해요. 연착륙은 서서히 속도를 조절해가며 활주로에 기체가 부드럽게 내려앉는 것입니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (153, "주식을 공개적으로 사들이는 방식으로 회사의 경영권을 손에 얻게 되는 경우가 있는 것을 뜻하는 단어는?", "적대적 M&A", "공개매수", "인수합병", "공개매수", "공개적으로 주식을 사들인다는 뜻이에요. 공개매수는 특히 적대적 M&A(인수합병)의 방법으로 자주 활용됩니다. 회사의 대주주가 지분을 넘기려고 하지 않을 때, 그 회사를 인수하려는 곳에서 다른 주주의 지분을 공개매수를 통해 사들이는 방식이죠. 그렇게 해서 얻은 지분이 기존 대주주보다 많다면 사실상 회사의 경영권을 손에 얻게 되니까요. 공개매수는 일정 기간을 잡아놓고, 그 기간 안에 시장 밖에서 주식을 사는 방식으로 이루어집니다. 이때, 시장에서 거래되는 주식 가격보다 높은 가격을 불러요. 기존 주주는 물론, 지분을 더 확보하려는 대주주가 주식을 더 사도록 만들기도 해서, 공개매수 공시가 나오면 +주가가 상승하는 모습을 보이곤 합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (154, "회사에서 급여를 줄 때, 직원의 4대보험료와 소득세를 나라에 대신 내주는 방식을 무엇이라 하는가?", "소득세징수", "공제", "원천징수", "공제", "공제(控除). 당길(공), 덜다(제). 사전적 의미로는 ‘뺀다’라는 뜻입니다. 세금 얘기할 때 등장하면 ‘특정 금액을 덜어준다’라고 해석하면 돼요. 회사에서 급여를 줄 때, 4대보험과 소득세를 공제한 금액을 입금합니다. 직원의 4대보험료와 소득세를 나라에 대신 내주거든요. 이렇게 세금을 걷는 방식을 원천징수라고 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (155, "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태예요. 이 형태는?", "자발적 금융", "관치금융", "자율금융", "관치금융", "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태예요. 금융이 법이나 시장 원리보다는 정책에 영향을 받아 + +움직이게 됩니다. 관치금융은 우리나라 금융시장의 특징이기도 합니다. 1990년대 이전 고도성장기에는 금융이 ‘국민 경제 성장’이라는 정치적인 목적을 위해 움직였어요. 당시 수출대기업에 금융지원을 몰아주는 정책은 강력한 성장 엔진이 되기도 했어요. 지금의 관치금융은 ‘금융만은 국가가 안전하게 보호해야 한다’와 ‘정부의 관리가 금융권의 자생력과 혁신을 가로막고 있다’는 이야기를 동시에 듣고 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (156, "OO를 통해 경제 활동의 크기와 방향을 알 수 있습니다.", "민간소비", "국내총생산 (GDP)", "경상수", "국내총생산(GDP)", "한 나라의 영역 내에서 가계, 기업, 정부 등 모든 경제주체가 일정기간 동안 생산한 재화 및 서비스의 부가가치1)를 시장가격으로 평가하여 합산한 것으로 여기에는 비거주자가 제공한 노동, 자본 등 생산요소에 의하여 창출된 것도 포함되어 있습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (157, "제품을 대량생산할 때, 단위당 생산 비용이 하락하는 현상을 가리키는 경제적 성질은?", "고정비용의 원칙 +\n(Fixed cost principle)", "규모의 경제 +\n(Rule-of-thump economics)", "단위생산 비용의 증가", "규모의 경제", "규모의 경제는 기업이 생산량을 늘리면서 제품 하나를 만드는 데 드는 단위당 생산 비용이 하락하는 현상이에요. 1천만 원을 들여 마스크 공장을 세웠을 때, 마스크를 딱 하나만 찍어내면 마스크 하나를 찍어내는 데 드는 비용은 1천만 원이에요. 하지만 고객의 주문이 늘어나 마스크를 1천 개 찍어내면 마스크 한 개당 생산 비용은 1만 원이 됩니다. 이렇게 고정비용이 줄어드는 규모의 경제가 실현되면 장기적으로 생산 비용이 줄어들어서 수익이 증가하게 돼요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (158, "비즈니스 분야에서 규제를 이행하고자 하는 회사의 실내 환경을 말하는 것은?", " 보증", "규제 샌드박스", "시장분석", "규제 샌드박스", "규제 샌드박스는 새로운 제품이나 서비스를 출시할 때 일정 기간 규제를 면제하거나 유예하는 제도예요. 혁신적인 서비스를 개발할 수 있다면 일단 제약 없이 해보라는 거예요. +\n샌드박스라는 의미는 모래놀이터(Sandbox)에서 유래되었어요. 모래놀이터에서 아이들이 덜 다치고 안전하게 노는 것 처럼 규제 샌드박스에서는 마음껏 아이디어를 펼쳐보라는 의미죠.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (159, "기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 표방하는 걸 홍보하는 걸 뜻하는 단어는?", "에코프리엔드", "그린워싱", "트래시핑", "그린워싱", "그린 워싱은 ‘Green’ 과 ‘White Washing’을 합친 말로, 기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 표방하는 것처럼 홍보하는 걸 의미합니다. 한마디로 친환경인 것처럼 세탁한다는 뜻이에요. 매출, 영업이익과 같은 재무정보와 달리, ESG 등 비재무정보는 평가 기준을 마련하기가 쉽지 않은데요. 빈틈을 이용해 ‘마치 ESG 성과를 잘 내는 것처럼’ 보이도록 그린 워싱을 하는 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (160, "생활비용에 영향을 주는 물가의 주요한 지수를 말하는 것은?", "국제물가지수", " 근원소비자물가지수", "근원판매자물가지수", "근원소비자물가지수", "소비자물가를 포함한 물가지수에는 ‘명목지수’와 ‘근원지수’ 두 종류가 있습니다. 소비자물가 명목지수는 흔히 ‘ 소비자물가지수’라고 불려요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (161, "은행이 금리를 인하하도록 요구하는 가장 강한 권리는?", "환급요구권", " 금리인하요구권", "통화정책위원회", "금리인하요구권", "금리인하요구권은 말 그대로 ‘(대출)금리를 내려달라고 요구할 수 있는 권한’이에요. +\n신용상태나 상환능력이 대출 당시보다 크게 좋아졌을 때 금리인하요구권을 행사해 대출금리를 낮출 수 있습니다. 구체적인 사유로는 신용등급 상승, 취업, 이직, 승진하거나 전문직 자격증을 땄을 때, 자산이 늘고 부채가 줄었을 때 등이 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (162, "금융과 산업을 분리하는 원칙이란 무엇입니까?", "금융규제", "금산분리", " 경영가치론", "금산분리", "금산분리는 금융과 산업을 분리한다는 원칙이에요. 일반 기업이 은행을 + +또는 은행이 비금융 기업을 일정 수준 이상 소유하지 못한다는 내용인데요. 금융과 산업이 결탁될 때 나타나는 불공정 경쟁 등 문제점을 막기 위한 조치입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (163, "금융통화위원회(금통위)는 매년 몇 회에 걸쳐 개최되는가?", "12회", "24회", "36 회", "24회", "금융통화위원회(금통위)는 1년에 24회 개최해 통화정책과 금융안정 등에 대해 논의합니다. 이 중 기준금리 등 통화정책을 결정하는 ‘통화정책방향 결정회의’는 8회 개최하고, 금융안정회의는 4회 개최합니다. 금통위는 한국은행 총재 및 부총재를 포함하여 총 7명의 위원으로 구성되어 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (164, "국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 뜻하는 단어는?", " 기초산업", "기간산업", "기본산업", "기간산업", "기간산업(key industry)은 기초산업(Basic industry)이라고도 합니다. 국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 기간산업이라고 부릅니다. 기간산업은 제1차 세계대전 당시 독일이 영국을 상대로 수출을 제한하자 각종 공산품이 모자라 어려움에 빠졌던 영국에서 처음 사용된 용어예요. 오늘날은 경제의 토대가 되는 기초 산업을 의미하기도 해요. 항공이나 완성차, 조선처럼 필수 물류와 관련되거나 통신 및 에너지처럼 다른 산업을 운영할 때 없어서는 안 되는 산업도 기간산업이에요. 우리나라의 반도체처럼 국가 경제에서 중요한 역할을 하는 산업도 기간산업입니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (165, "기업결합의 목적은 ?", "경영권을 넘겨주기 위함", "시장 경쟁을 제한하는 걸 막기 위해", "새로운 제품을 개발하기 위함", "시장 경쟁을 제한하는 걸 막기 위해", "흔히 M&A, 인수합병이라고 부르는 건 기업결합의 한 종류입니다. 기업결합은 서로 다른 기업이 하나로 합치는 것을 뜻하는데, 인수합병 말고도 다양한 방식이 있어요. M&A는 Mergers(합병) and Acquisition(인수)의 약자예요. 순서가 거꾸로 돼 있긴 하지만 ‘인수합병’과 같은 뜻이에요. 인수합병에서 인수는 다른 기업의 경영권을 넘겨받는 것을 뜻합니다. 경영권을 넘겨준 기업에서는 매각했다고 표현해요. 합병은 둘 이상의 기업이 하나의 기업으로 합쳐지는 것을 뜻합니다. 공정거래위원회(공정위)는 시장 독점이 나타나거나, 지배적 사업자가 시장 경쟁을 제한하는 걸 막기 위해 기업결합 심사를 진행합니다. 매출액, +자산, 점유율 등 일정 기준을 넘어서는 기업결합이 심사 대상이에요. 공정위는 기업결합 이후에 시장점유율이 어떻게 바뀔지를 기준으로 평가하는데요. 시장 경쟁이 크게 제한되지 않을 전망이면 승인하지만, 시장 경쟁이 제한되는 상황이라면 불허 또는 조건부 승인 결정을 내리게 됩니다. 공정위가 불허를 내린 예시가 있습니다. 지난 2016년, SK텔레콤이 CJ헬로비전을 인수하려 했을 때예요. 이동통신 시장에서 독과점 우려가 있었기 때문인데요. 결국 두 기업의 인수합병은 불발됐습니다. 조건부 승인 결정을 내린 경우도 있는데요. 딜리버리히어로와 우아한형제들 간의 기업결합이에요. 기업결합 심사 당시, 딜리버리히어로는 ‘요기요’와 ‘배달통’을 소유한 상태였어요. 우아한형제들까지 인수하면 배달업계의 시장점유율 약 90%를 차지해 독과점 사업자가 될 수 있었습니다. 이걸 막기 위해 요기요를 매각한 뒤 우아한형제들을 인수하라는 조건을 건 거예요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (166, "경제지표를 읽을 때 왜곡되는 현상은?", "변동성", "기저효과", "트렌드", " 기저효과", "경제지표를 평가할 때 임의로 정한 기준시점 때문에 결과가 왜곡되는 현상이에요. 전년 대비 물가 상승률을 예로 들어 보겠습니다. 2020년과 대비했을 때, 2021년 연간 물가 상승률이 10%, 2021년 대비 2022년의 연간 물가 상승률은 2%라고 가정할게요. 2022년 전년 대비 연간 물가 상승률만 얘기했을 때는 2%로, 상당히 낮은 수치입니다. 하지만 사람들은 살림살이가 굉장히 +팍팍하다고 생각할 거예요. 왜냐면 2020년을 기준으로 2022년 물가 상승률을 계산하면 고작 2년 만에 물가가 12.2%나 올랐으니까요. 이때 2022년 전년 대비 연간 물가 상승률 2%를 두고 기저효과가 적용됐다고 합니다. 이미 오를 만큼 올라서 더 크게 오르지는 않는다는 뜻이에요. 이런 기저효과는 지표를 축소해 나타내기도 하지만, 부풀려서 나타내기도 합니다. 경제지표를 읽을 때는 기저효과를 항상 염두에 둬야 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (167, "은행이 돈을 빌려주는 최저 가격을 뜻하는 단어는?", "환율", "기준금리", " 주식가치", "기준금리", "금리는 돈을 빌려줄 때, 미래에 더해질 가치를 계산해서 이자를 붙이는 것입니다. +\n문제는 정확한 기준이 없다는 거예요. 물건이나 서비스마다 시간에 따라 비싸지는 정도가 다르니까요. +그래서 정부가 기준으로 내놓는 것이 기준금리입니다. +\n우리나라의 기준금리는 한국은행 금융통화위원회가 이런저런 경제지표를 참고해서 결정해요. \n기준금리를 올리면 ‘콜금리’라는 금리는 즉시 올라가게 됩니다. 콜금리는 은행, 증권사, 보험사와 + +같은 금융기관들이 ‘서로’ 돈을 빌릴 때 적용되는 금리예요. +\n콜금리가 상승하면 은행이 돈을 굴리며 금융시장을 끌어가는 데 비용이 더욱 들기 때문에 다른 +금리도 전반적으로 오르게 되어 있어요. 기준금리가 콜금리를 움직이고, 콜금리가 다시 금융시장을 건드리고, 금융시장이 다시 경제에 영향을 주는 거예요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (168, "기초자산이 특정 조건을 만족하면 수익이 나고, 특정 조건에서 벗어나면 손실이 발생하는 파생상품의 경우, 원금이 손실되는 것을 무엇이라고 하나요?", "녹아웃 (Knock-out)", " 녹인 (Knock-in)", "배리어 브레이크 (Barrier Break)", "녹인 (Knock-in)", "채권·주가지수· 개별종목 등 기초자산이 있는 파생상품의 경우, 기초자산 상태에 따라 수익 발생 지점과 손실 발생 지점이 있습니다. 기초자산이 특정 조건을 만족하면 수익이 나고, 특정 조건에서 벗어나면 손실이 발생해요. 이때, 파생상품에서 손실이 발생해 원금이 손실되는 것을 ‘녹인(Knock-in)’이라고 합니다. 원금손실구간에 진입하는 것을 ‘녹인 배리어(Knock-in barrier)’를 터치했다고 합니다. 기초자산이 있는 금융상품에 투자할 때는 ‘녹인(Knock-in)’ 조건을 반드시 살펴보고, 숙지해야 합니다.", +"MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (169, "주식과 채권시장을 중심으로하지 않는 자산에 투자하는 것을 뜻하는 단어는?", " 사모펀드", "대체투자", "인프라 투자", "대체투자", "대체투자는 주식과 채권시장과 상관관계가 적은 자산에 투자하는 것을 뜻해요. 구체적으로는 오피스, 호텔 등 부동산이나 사모펀드를 통한 기업 지분 투자, 인프라 투자 등이 있습니다. 중간 정도의 위험, 중간 정도의 수익률을 보여서 비교적 안정적이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (170, "은행이 고객에게 제공하는 대출 상품의 금리를 낮게 조정하는 방식을 나타내는 단어는?", "이자율", "대출우대금리", "금융규제", "대출우대금리", "대출우대금리(Loan Prime Rate, LPR)는 은행이 최우량 고객에게 제공하는 금리로 ‘사실상 중국의 기준금리’로 여겨집니다. \n18개 시중은행이 매달 LPR을 중국 당국에 제출하면, 당국에서는 그 평균값을 내서 발표해요. \n우리나라는 금융통화위원회에서, 미국은 FOMC에서 기준금리를 결정합니다. +\n반면, 중국은 LPR을 기준으로 은행들이 일반 고객의 대출금리를 정합니다. 이렇게 해야 실질 대출금리를 낮출 수 있다는 게 중국 인민은행의 입장이에요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (171, "물건을 저가에 대량으로 팔아버리는 걸 뜻하는 단어는?", "할인 판매", "덤핑", " 정가제한", "덤핑", "‘덤핑(dumping)’은 쓰레기를 갖다 버리듯이 물건을 저가에 대량으로 와르르 팔아버리는 걸 뜻하는 단어예요. 저렴하게 파는 ‘할인 판매(세일)’와 ‘덤핑’ 사이에 절대적인 기준은 없어요. 다만 판매가가 원가보다 낮을 정도로 채산성(수익성)을 전혀 신경쓰지 않는다면 덤핑에 해당한다고 볼 수 있어요. 업계에서는 원가를 아니까 경험적으로 구분할 수 있죠. 덤핑은 정상가격으로 판매하는 업자들의 사정을 어렵게 만들어 시장질서를 교란시키기 때문에 다들 예민하게 반응하는 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (172, "경제 사이에 있는 서로의 일치현상을 뜻하는 단어는?", "동조", "디커플링( 탈동조화)", "커플링", "디커플링(탈동조화)", "보통 한 나라의 경제는 그 나라와 관련 있는 다른 나라의 경제 상황과 비슷하게 흘러갑니다. 서로 무역과 투자를 하며 연결돼 있기 때문에 한 나라에서 너무 큰 변화가 일어나면 다른 나라도 어느 정도 그 변화에 따라가는 거예요. 이런 흐름을 커플링( 동조) 현상이라고 합니다. 우리나라의 주요 교역국인 중국 경기가 좋으면 우리나라의 경기도 활발해지는 것이 자연스러운 동조의 예시입니다. 인위적인 동조화의 예시로는 미국처럼 기축통화를 가진 나라가 금리를 올리면 우리나라도 정책적으로 금리를 올리는 것이 있어요. 반대로 디커플링(탈동조화)은 부작용을 감수하고 독자적인 경제정책을 운영하거나, 어떤 계기로 서로 연관성이 옅어지는 현상이에요.", +"MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (173, "자산배분 현황을 한눈에 보여주는 포트폴리오 관리 방법은?", "투자분석", "리밸런싱 (Relabeling)", "포트폴리오조정", "리밸런싱", "포트폴리오는 자산배분 현황을 한눈에 보여줍니다. 리밸런싱은 포트폴리오를 주기적으로 점검해서 나의 자산배분 목표에 맞게 다시 밸런스를 잡아 주는 거예요. 돈관리를 건강한 몸 만들기로 비유해 볼게요. 가계부를 작성하는 건 내가 섭취하고 소비하는 칼로리를 기록하는 과정이고, 리밸런싱은 주기적으로 인바디를 체크해서 몸의 상태를 점검하는 거라고 볼 수 있어요.", "MUL", 1000000, 100000, FALSE); + +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (174, "리베이트의 실제 의미는?", "불법적인 마케팅", "판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’", "소비자 가격을 올리는 행위", "판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’", +"리베이트(rebate)는 프로모션의 한 종류입니다. 리베이트는 큰 금액이 오가는 기업과 기업 사이 (B2B) 거래에 빈번하게 일어나는 관행이에요. 쉽게 말해 ‘판매장려금’이나 ‘구매사례금’, 또는 ‘ 환급금’이라고 할 수 있죠. 예를 들어, A 회사가 1000만 원짜리 기계 10개를 B 회사에 판매하고 1억 원을 받은 다음, 판매 금액의 10%인 1000만 원을 다시 B 회사에 돌려주는 것이 바로 리베이트예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (175, "리볼빙이란 카드 대금을 갚는 세 가지 방식 중 하나입니다. 이 방식의 특징은 무엇입니까?", "부분납액", "일부 금액이 월약정으로 결정됩니다.", "완납액", "일부 금액이 월약정으로 결정됩니다.", "리볼빙은 카드대금을 갚는 세 가지 방식 중 하나예요. ‘일부 금액’은 비율 (%)로 결정됩니다. 이번 달에 갚을 총금액이 100만 원이고 리볼빙의 결제 비율을 10%로 설정한 +경우를 가정해 볼게요. 이번 달에 낼 결제대금은 100만 원의 10%, 10만 원입니다. 나머지 90만 원은 다음 달로 넘어가요. 여기에 함정이 있습니다. 이번 달만이 아니라, 다음 달에도 전체 결제대금의 10% 만 결제되고 나머지 90%는 다음 달로 넘어갑니다. 그다음 달에도 마찬가지예요. 문제는 갚아야 하는 원금에 ‘지난달에서 넘어온 돈’만이 아니라 ‘이번 달에 소비한 돈’까지 들어간다는 점이에요. 이게 반복되면 결제 대금이 눈덩이처럼 늘어나요. 게다가 리볼빙의 평균 대출금리는 10~15%에 달합니다. 당장은 결제대금에 대한 부담을 줄일 수 있지만, 순식간에 대출잔액이 늘어날 수 있는 고금리 대출상품이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (176, "부동산 자산을 묶어둔 투자상품으로, 투자자들이 돈을 모아 부동산에 투자하고 임대료·매각 차익 등 수익을 배당으로 돌려주는 방식은?", "일반 펀드", "리츠", "주식투자", "리츠", +"리츠는 다양한 부동산 자산을 묶어둔 투자상품입니다. 투자자들의 돈을 모아 부동산에 투자하고, 임대료·매각 차익 등 수익을 배당으로 돌려주는 방식이에요. 리츠를 통해 적은 돈으로도 부동산 시장에 투자할 수 있어요. 이 중 주식시장에 상장된 리츠를 ‘공모 리츠’라고 합니다. 리츠도 일반 기업이 주식시장에 상장될 때 밟는 과정을 똑같이 거쳐요. 리츠 투자로 얻을 수 있는 수익은 크게 두 가지가 있습니다. 리츠를 낮은 가격에 사서 비싼 가격으로 팔아서 얻는 시세차익과 배당금을 받는 배당 수익이에요. 리츠는 배당 수익에 무게가 쏠려있는 투자상품이에요. 매년 배당가능이익의 90% 이상을 의무적으로 배당하고 있어서, 주주들에게 높은 배당금을 지급하는 걸로 유명합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (177, "신용대출의 방법 중 하나는 무엇입니까?", "신용카드", "마이너스통장", " 파워트레이딩", "마이너스통장", "마이너스통장은 신용대출의 방법 중 하나예요. 일단 부동산 같은 담보를 걸어놓지 않고 오직 내 신용만을 믿고! 약속한 한도만큼의 돈을 빌려주는 게 신용대출입니다. 신용대출에도 종류가 있습니다. 대출을 받을 때 빌리는 방식을 선택할 수 있어요. 건별로 한 번에 얼마씩 빌리는 방법이 있고 한도 내에서 통장에서 필요할 때 찾아 쓰는 방식이 있습니다. 건별로 +빌리는 건 그대로 신용대출이라 불러요. 이 중 한도 내에서 통장에서 필요할 때 찾아쓰는 방식을 +활용한 상품을 마이너스통장이라 부르죠.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (178, "증권사에서 상장 기업의 주식에 대한 의견과 목표 주가를 발표할 때, 주식을 팔지 (Sell) 할 것을 내놓는 경우는?", "목표 주가", "팔자(Sell)", "거의 없습니다", "거의 없습니다", "증권사에서는 보고서로 상장 기업의 주식에 대한 의견과 목표 주가를 발표합니다. 기업의 이익 전망치를 고려해, 해당 기업의 주식을 살지(Buy), 팔지(Sell), 그대로 있을지, 비중을 확대할지, 비중을 축소할지 등의 의견을 내고 가까운 미래에 도달할 것으로 예상하는 목표 주가를 제시해요. 증권사 보고서는 의견과 목표 주가에 대한 이유를 중심으로 참고하는 게 좋습니다. 우리나라 증권사는 ‘팔자(Sell)’ 의견을 거의 내놓지 않고, 목표 주가도 높게 잡는 경향이 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (179, "물건을 여러 부분으로 나누어 가치있는 물질로 분리하는 작업을 뜻하는 단어는?", " 합병", "물적분할", "증식", "물적분할", "물적 분할은 ‘기업 분할’의 한 종류입니다. 기업 분할은 말 그대로 기업을 나누어서 가른다는 뜻이에요. +\n물적 분할은 어떤 기업(모기업)이 특정 사업부를 독립적인 회사(자회사)로 분리하면서, 모회사가 + +자회사의 지분 100%를 소유하는 걸 뜻해요. 기존에 모회사 투자자에게 자회사 주식이 돌아가지 않아요. \n자회사로 독립한 (구)사업부 때문에 모기업에 투자했던 투자자에게는 참 아쉬운 상황이에요. 직접적인 관련 없이 건너건너 아는 사이가 된 거니까요. +\n만약 자회사가 주식시장에 상장한다면? 모기업에 투자했던 투자자 입장에서는 배신감이 들 수밖에 없어요. 그동안 열심히 투자금을 보태왔더니, 알짜 사업을 갖고 따로 상장해버리는 거니까요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (180, "주가가 꾸준히 오르다가 갑자기 큰 폭으로 하락하는 경우를 말할 때 사용하는 경제적 용어는?", "급락", "반락", "대폭락", "반락", "영어로는 ‘a reactionary fall’로 주가가 잘 오르다 말고 갑자기 큰 폭으로 하락하는 현상을 뜻해요. 눌렀을 때 튀어 오른다는 뜻인 ‘반발’의 반대 의미라고 볼 수 있어요. ‘급락’과는 다릅니다. ‘주가가 크게 떨어졌다’는 상황 자체를 강조할 때는 급락을, ‘주가가 계속해서 오르고 있었다가 갑자기 떨어졌다’는 현상을 강조할 때는 ‘반락’을 사용해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (181, "전 세계를 상대로 유가증권을 인수하고, 글로벌 기업 M&A 자문을 하며, 기업과 정부의 자금 조달을 주선하는 투자은행을 말하는 약자는?", "인수합병", "벌지 브래킷", "장기자금", +"벌지 브래킷", "전 세계를 상대로 1 채권이나 주식 같은 유가증권을 인수하고 2 글로벌 기업 M&A(인수합병) 자문을 하기도 하며 3 기업과 정부의 자금 조달을 주선하고 중개하는 등 투자은행이 할 수 있는 거의 모든 일을 하는 초거대 일류 투자은행을 말합니다. 투자은행은 장기적인 산업 자금을 담당하며, 개인은 상대하지 않습니다. ( ) 투자은행 중 벌지 브래킷은 약자로 ‘BB’라고 부르기도 해요. 현재 전 세계에 딱 아홉 개의 투자은행이 BB입니다. 바로 JP모건, 골드만삭스, 모건스탠리, 뱅크오브아메리카 메릴린치, 씨티그룹, 크레디트스위스, 바클리즈은행, 도이체방크, UBS예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (182, "베이지북이란 어떤 것을 의미하는 단어인가?", "트렌딩", "베이지북", "스타트업", +"베이지북", "미국 연방준비제도이사회(연준)는 매년 8회 ‘베이지북’을 공개합니다. +\n연준 산하의 12개 지역 연방준비은행이 각 지역경제를 조사 및 분석한 보고서예요. 일종의 미국 경제 최신 동향 보고서라고 볼 수 있어요. 미국의 경제 현황을 파악하는 데 중요한 기준이 되기 때문에 눈여겨볼 필요가 있어요. +\n참고로 원래는 표지가 빨간색이라서 ‘레드북’이라고 불렸는데요. 일반인에게 공개되기 시작하면서 표지는 베이지색으로, 이름은 ‘베이지북’으로 바뀌어 불리게 됐답니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (183, "금융시장에서 수익률을 정할 때 기준이 되는 것은 무엇일까요?", "목표수익", " 벤치마크", "금리", "벤치마크", "기준점 또는 표준을 의미합니다. 원래는 토목공학에서 토지 높이를 잴 때 기준점을 의미하는 용어였는데, 지금은 IT에서 성능 테스트를 할 때나 금융시장에서 목표 수익률을 정할 때도 활용하고 있어요. 금융에서 벤치마크 금리라고 하면 수익률의 기준이 됩니다. 미국 국채 10년물은 가계대출과 기업대출 등 다른 금융상품과 연동이 되어 있기 때문에 자주 시장의 벤치마크가 돼요. 미국 국채 10년물 금리를 기준으로 시장을 판단하겠다는 거예요. 개인 투자를 할 때도 활용할 수 있어요. 현재 주택담보대출 금리를 벤치마크 금리로 삼겠다고 하면, 현재 주택담보대출 금리보다는 더 벌어야 제대로 수익을 냈다는 의미예요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (184, "Variable interest rate의 뜻은 무엇입니까?", "고정금리", "변동금리", " 예수금", "변동금리", "빌리는 금액이 많고 갚는 기간이 긴 대출은 지금 빌린 돈의 가치가 나중에 어떻게 될지 알 수가 없습니다. +\n미래의 상황에 유연~하게 대응하기 위해, 대출금리가 기준금리의 움직임을 반영해 변하기도 해요. 이런 방식을 두고 ‘변동금리’라고 합니다. +\n‘고정금리’는 처음 대출상품에 가입할 때 정해놓은 금리 그대로 적용받는 방식입니다. +\n요즘에는 고정금리와 변동금리를 결합한 혼합금리 대출도 많이 나와 있어요. 일정 기간 고정금리를 적용받다가, 변동금리로 바뀌는 방식이에요. +\n일반적으로 같은 대출상품이더라도 변동금리가 고정금리보다 낮게 책정돼있습니다. +\n그런데 요즘 같은 금리 인상기에는 고정금리를 찾는 분들이 많아져요. 변동금리를 택할 경우, 기준금리가 오를 때 부담이 커질 수 있기 때문에 당장 금리가 높더라도 고정금리를 택하는 거예요.", "MUL", 1000000, 100000, FALSE); + +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (185, "‘주식매도제한’을 실현하기 위한 장치 중 하나는?", "포화가입", "보호예수", " 사기", "보호예수", "보호예수(保護預受)는 ‘보호하다(보호) + 맡기다(예) + 받다(수)’로 구성된 한자어입니다. 여기서 ‘예수’는 귀중품, 유가증권 등 어떤 것(주로 가치 있는 것)을 금융회사가 보관하는 것을 뜻해요. +\n우리나라 증권시장에는 어떤 요건에 해당하는 주주가 일정 기간 동안 보유한 주식을 사고 팔지 못하게 제한하는 ‘주식매도제한(Lock up)’이 있습니다. +\n보호예수는 ‘주식매도제한’을 실현하기 위한 장치 중 하나입니다. 기업의 주식을 많이 가진 최대주주 또는 특수관계인(투자자 등)이 일정 기간 주식을 매도하지 않도록 일시적으로 제한하는 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (186, "민간택지 분양가를 정하는 제도는?", "국토정비사업", "분양가상한제", " 주택보금자리", "분양가상한제", "분양가상한제는 분양가에 상한선을 정한 제도입니다. 분양가상한제는 1977년 처음 도입된 후에 폐지와 부활을 반복했는데요. 2020년 7월 29일부터 시행된 분양가 상한제의 정식 명칭은 ‘민간택지 분양가상한제’입니다. 초기 분양가상한제는 공공택지에만 적용됐다가 2007년에 처음으로 민간택지에도 도입됐어요. 도입 이후 주택공급이 위축되면서 분양가상한제가 적용되는 민간택지의 요건을 강화해 제도가 흐지부지된 적이 있었는데요. 2020년부터 적용대상과 기준을 개정한 민간택지 분양가상한제를 시행했습니다. 2007년에 시행될 때는 전국에 동시 적용하는 제도였지만, 2020년부터 새롭게 적용된 민간택지 분양가상한제는 ‘투기과열지구’에만 적용됐습니다. 민간택지의 분양가상한가격은 ‘택지비+건축비’로 산정됩니다. 여기에 2022년 6·21 부동산대책으로 주거이전비, 손실보상비 등 추진과정에서 필수적인 요인의 합리적인 반영분과 자재가격 급등 반영분이 추가되었어요. 여기서 관건은 ‘택지비’입니다. 택지비는 시세가 아니라 감정평가액을 기준으로 하기 때문에 주변 땅값 시세보다 낮게 나와요. 택지비 감정평가액의 객관성도 중요한데요. 6·21 부동산대책으로 외부 검증위원회를 신설하는 규정이 생겼습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (187, "인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데, 노동조합이 반발하여 사람들은 어느 편도 들지 않았던 영국의 정치현상은?", "영국 경제 위기", "불만의 겨울", "노조 분쟁", "불만의 겨울", "불만의 겨울은 1978~1979년 영국에서 일어났던 정치현상이에요. 당시 영국 정부는 인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데, 노동조합이 크게 반발했습니다. 정부와 노조의 대립은 극단적으로 심해졌고, 사람들은 어느 편도 들지 않았어요. 이 현상은 정권이 바뀌며 마거릿 대처가 총리로 등장하는 데 영향을 주었어요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (188, "금융상품을 판매할 때 소비자에게 정확한 정보를 제공하지 않은 경우를 말하는 단어는?", "위약서", "불완전판매", "과소광고", "불완전판매", "은행, 증권사, 보험사 등 금융회사가 소비자에게 금융상품을 판매하는 과정에서, 반드시 지켜야 할 사항을 누락했거나 정보를 허위, 과장해서 소비자가 상품에 대해 잘못 인식하도록 판매한 사례를 뜻합니다. 원금 손실이 발생하는 금융 상품을 판매할 때, 은행은 고객에게 원금 손실이 발생한다는 사실을 고지하지 않았거나, ‘절대 손해보지 않는 안전자산’이라고 설명하는 식입니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (189, "운송 수요나 운임이 급감할 때 피해를 최소화하기 위해 취소하는 것을 뜻하는 단어는?", "트래싱", "지연 출항", "운송 중단", "블랭크 세일링", "블랭크 세일링(Blank Sailing)은 화물선 임시결항으로, 운송 수요나 운임이 급감할 때 피해를 최소화하려고 예정된 운항 전체나 특정 항구 정박을 취소하는 것을 뜻해요. 블랭크 세일링이 발생하면 개별 회사나 개인 소비자는 주문한 상품이 배송되기까지 더 많은 시간을 기다려야 할 수 있습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (190, "블록 경제는 어떤 경제 시스템을 말합니까?", "자유무역 체제", "블록 경제", " 지배경제", "블록 경제", "정치적, 경제적으로 관계가 깊거나 비슷한 문화를 가진 여러 국가가 결집해 ‘블록(block)’을 만드는 경제 시스템이에요. 블록 안에서는 서로 자유롭게 거래하는 반면, 블록 바깥 국가와는 거리를 두고 장벽을 쌓곤 합니다. 블록 경제는 식민지를 이용한 경제시스템이 돌아가던 18~19 세기와, 1920~1930년대 대공황 이후 미·소 냉전 시절에 등장한 적이 있습니다. 현재 코로나19 +팬데믹 이후 글로벌 공급망을 재편하면서 다시 경제가 블록화되고 있어요. 대체로 러시아와 중국을 한 + +블록으로 묶고, 미국을 중심으로 한 국가를 한 블록으로 묶습니다. 인도나 동남아시아는 어디에도 끼지 않고 실리를 챙기려는 움직임을 보이고 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (191, "취업하고 싶어도 일할 수 있는 능력이 없는 사람, 전업주부, 군인 등이 속하는 인구를 뜻하는 단어는?", "실업자", "비경제활동인구", "취직자", "비경제활동인구", "만 15세가 넘은 인구 가운데 취업자도 실업자도 아닌 사람을 뜻해요. 취직할 의사가 없고 구직활동을 하지도 않는 사람이 비경제활동인구에 속합니다. 실업자는 취업할 의지가 있고, 실제로 구직활동을 하는데도 취직하지 못하고 있는 사람이에요. 비경제활동인구는 일을 하고 싶어도 일할 수 있는 능력이 없는 사람도 포함해요. 또, 전업주부나 군인, 학생 등도 비경제활동인구에 속합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (192, "경제 시스템에서 특정 집단의 이익을 우선하는 정치적·경제적 견해를 말할 때 +사용되는 단어는?", "자본론", "비둘기파", "노동당", "비둘기파", "경제정책을 이야기할 때, 종종 ‘비둘기’와 ‘매’가 등장하곤 합니다. +\n‘비둘기파’는 경기 부양을 위해 금리를 낮추고 시장에 돈을 푸는 양적완화를 주장하는 사람을 뜻하고, +‘매파’는 경기 과열을 막고 물가를 안정시키기 위해 금리를 높여야 한다고 주장하는 사람들 뜻해요. \nFOMC 파월 의장은 비둘기파와 매파의 중간인 ‘올빼미파’로 불립니다. 비둘기 혹은 매, 둘 중 하나로 치우쳐지지 않는 새로운 성향을 의미한다고 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (193, "기준금리를 0.25%p 올릴 때는 일반적으로 어떻게 하지만, 이번에는 0.50%p 만큼 올렸습니다. 이러한 경우를 무엇이라고 부르나요?", "자이언트 스텝", "빅스텝", "세 단계 스텝", +"빅스텝", "보통은 기준금리를 올릴 때 0.25%p씩 올려요. 이번에는 0.25%p의 두 배인 0.50%p 만큼 올린 건데요. 이렇게 한꺼번에 두 단계를 올리는 것을 두고 ‘빅 스텝’이라고 불러요. 세 단계 (0.75%p)를 올릴 때는 ‘자이언트 스텝’이라고 표현합니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (194, "지구계획이 승인된 이후로 청약을 받는 제도는?", "예산집행", "사전청약", " 시장조사", "사전청약", "청약은 한자어로 ‘계약을 체결할 것을 요청하는 행위’를 뜻합니다. 새로 짓는 아파트를 분양 받을 권리(분양권)를 청약하는 것이 ‘주택청약’이에요. +\n청약은 보통 아파트 착공 후에 이루어집니다. 사전청약은 이보다 1~2년 이상 앞서서, 지구계획이 승인된 이후로 청약을 받는 제도예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (195, "산업활동동향이 나타내는 바를 알리는 것은?", "경쟁의 정도를 알 수 있습니다.", +"산업활동동향", "인건비의 비율을 알 수 있습니다.", "산업의 추세와 성장률을 알 수 있습니다.", +"산업활동동향은 각 산업부문별 성적표로 크게 생산, 소비, 투자, 경기로 나눠서 동향을 분석해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (196, "어떤 기업의 주식이 코스피, 코스닥, 코넥스와 같은 주식시장에서 거래되기 위해 해야 하는 것은?", "고가발행", "상장폐지", "거래중지", "상장폐지", "어떤 기업의 주식이 코스피, 코스닥, 코넥스와 같은 주식시장에서 거래되려면, 그 기업이 주식시장에 상장(上場)해야 해요. 한자 그대로 해석하면 ‘시장에 명패를 내건다’는 뜻입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (197, "생산자물가지수를 측정하는 것은 무엇입니까?", "소비자물가지수", "생산자물가지수", "실질인구지수", "생산자물가지수를 측정하는 것은 물가상황을 파악하기 위해 사용되는 지표입니다.", +"생산자물가지수(Producer Price Index, PPI)는 생산자 입장에서 측정한 물가입니다. 생산자가 물건과 서비스를 만드는 데 사용하는 상품과 서비스의 평균가격이라는 뜻이에요. +\n생산자물가가 상승하면 소비자물가가 올라요. 다시 말해, 인플레이션으로 이어질 가능성이 커요. 특히 미국의 인플레이션은 전 세계 시장에 영향을 미치기 때문에 미국의 생산자물가와 소비자물가 관련 지표를 주목하곤 합니다. +\n미국이 자국 경기 상황이 과다한 인플레이션 국면에 접어들었다고 판단하면, 기준금리를 올릴 수 있습니다. 기준금리를 조정해 시장에 풀리는 돈의 양을 조절하는 방식으로 인플레이션을 가라앉히려고 하는 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, + +option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (198, "한 나라가 다른 나라와 경제적 거래를 나눈 결과 발생한 수입과 지출의 차이를 뜻하는 단어는?", "수입", "서비스 수지", "투자", "서비스 수지", "수지’는 한 나라가 다른 나라와 경제적 거래를 나눈 결과 발생한 수입과 지출을 뺐을 때 얼마인지 따져보는 거예요. 장사를 잘 해서 흑자를 보면 수지 흑자, 수입이 더 많아서 적자를 보면 수지 적자라고 합니다. 서비스 수지는 서비스를 사고 팔아 발생한 수입과 지출의 차이를 뜻해요. 서비스 수지에는 운수·여행·통신서비스·보험서비스·특허권 등 사용료·사업서비스·정부서비스·기타서비스 8개 항목이 포함됩니다. 우리나라 서비스 수지는 보통 적자예요. 해외 교육 서비스나 해외 여행, 해외 로열티 지급 등의 서비스 지출이 굉장히 많거든요.", +"MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (199, "선물·옵션 동시 만기일은?", "연초", "매년 3, 6, 9, 12월 세 번째 금요일", "6 월, 12월 첫 번째 목요일", "매년 3, 6, 9, 12월 세 번째 금요일", "매년 3, 6, 9, 12월 세 번째 금요일은 미국 증권시장의 선물·옵션 동시 만기일입니다. 우리나라 증권시장의 선물·옵션 동시 만기일은 매년 3, 6, 9, 12월 두 번째 목요일이에요. +\n미국의 경우, 선물 만기일은 3, 6, 9, 12월 세 번째 금요일이고 옵션 만기일은 매월 세 번째 금요일이에요. +\n선물과 옵션은 거래 기간이 정해져 있어요. 즉, 만기일이 있습니다. 만기일에 투자자는 1물건을 인도받거나 2만기일을 연장(롤오버)하거나 3청산해요. +\n3번의 경우, 선물과 옵션을 가진 투자자가 만기일에 매물을 청산하면 매도 물량이 평소보다 많이 나올 수 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (200, "물건을 미리 생산하거나 예약하여 시장가격이 상승할 때를 말하는 단어는?", "예금", "선물", "자산", "선물", "선(先) + 물건 물(物). 한자 뜻 그대로 미래의 특정 시점에 물건을 사고파는 약속을 의미합니다. +\n선물거래는 농산물 시장에서 시작됐어요. 배추, 쌀, 밀과 같은 농·축·수산물은 생산량에 따라 가격변동이 특히 심하기 때문에, 미래의 가격을 미리 정해주는 선물거래를 이용해 가격변동 위험을 줄이려 했어요. +\n선물거래에는 두 가지의 지불 방법이 있어요. 현물을 직접 거래하는 인수도결제가 있고요. 현물을 직접 거래하지 않고 차익만 거래하는 현금거래가 있습니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (201, "세금을 내기 전에 소득이 얼마나 줄어드는지 확인하는 과정은?", "세액공제", " 소득공제", "연말정산", "소득공제", "우리는 벌어들인 소득에 대한 세금을 내야 합니다. 세금은 소득을 신고할 때 내는데, 정부 정책 등으로 세금을 깎아주는 경우도 있어서 나중에 정산하는 절차가 필요해요. 직장인의 경우, 이 절차가 ‘연말정산’입니다. 세금을 깎아주는 방식은 크게 소득공제와 세액공제로 나뉩니다. 소득공제는 세금을 매기는 기준이 되는 ‘소득’을 덜어주는 것이고, 세액공제는 소득을 기준으로 계산한 ‘세금’에서 얼마간 덜어주는 것입니다. 연말정산을 할 때, 소득공제와 세액공제를 적용받고 난 ‘결정세액’을 계산합니다. 그리고 이 결정세액을 ‘내가 이미 낸 세금( 기납부세액)’과 비교해, 더 낸 만큼 돌려받거나 덜 낸 만큼 더 내요. ‘연말정산 이후 돈을 토해냈다’ 고 하는 경우, 결정세액이 기납부세액보다 컸다는 뜻이에요. 반대로 ‘13월의 월급을 받았다’라고 하는 경우는 결정세액이 기납부세액보다 작다는 뜻입니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (202, "물건을 판매하는 데 필요한 예측은?", "가격예측", "수요예측", "시장조사", " 수요예측", "수요예측은 공모주의 가격인 공모가를 결정하기 위해 수요상황을 파악하는 걸 말합니다. \n공모주: 기업이 상장할 때는 신주(새로운 주식)를 발행하고 신주의 주인을 공개적으로 모집하는 ‘ 공모’ 단계를 거칩니다. 이때의 신주를 ‘공모주’라고 해요. +\n공모가: 공모주에는 상장 전에 거래되던 주식 가격이 아닌 새롭게 책정된 가격, 즉 공모가를 적용해야 합니다. 공모가는 먼저 대표주관회사가 발행 주식의 공모희망가격(밴드)을 제시하는 걸로 기준이 정해집니다. +\n수요상황 파악: 증권사, 보험사, 국민연금 등 기관투자자에게 수요예측을 실시해 공모희망가격 구간 내에서 얼마의 가격에 몇 주를 사고 싶냐는 수요를 물어봅니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (203, "반도체 기업이 생산한 제품 중 결함이 없는 제품의 비율을 나타내는 단어는?", " 성과", "수율", "품질", "수율", "수율은 한자어예요. 무언가를 거둔다는 뜻의 ‘수(收)’, 비율 ‘율 + +(率)’로 이루어져 있습니다. 반도체에서 수율은 ‘결함이 없는 합격품의 비율’을 뜻해요. 웨이퍼 한 장에 들어갈 수 있는 칩의 최대 개수 중, 정상적으로 작동하는 칩의 개수를 나타냅니다. 반도체 기업에서 수율을 높이는 것은 굉장히 중요해요. 수율이 높아질수록, 같은 원자재를 투입해서 더 많은 합격품을 만들어낼 수 있으니까요. 삼성전자, SK하이닉스 등 우리나라의 주요 반도체 기업도 수율을 끌어올리기 위해 기술을 개발하고 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (204, "문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하는 방법을 무엇입니까?", "피싱", "스미싱", "트래싱", "스미싱", "스미싱(Smishing)은 ‘문자메시지(SMS)’와 ‘피싱(Phishing)’을 합친 단어예요. 문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하는데요. 이후 악성 앱을 설치하거나 전화를 유도해 금융정보, 개인정보를 탈취하는 수법으로 사기에 이용해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (205, "주식을 저가에 살 수 있는 권리를 받은 후, 주가가 오르면 돈을 벌 수 있는 방법은?", +"인베스트먼트", "스톡옵션", "에이프티", "스톡옵션", "스톡옵션의 상법상 정식 명칭은 주식매수선택권입니다. 말 그대로 주식을 살지 말지 선택할 수 있는 권리라는 뜻인데요. ‘계약 당시에 정해놓은 가격’으로 살 수 있다는 게 엄청난 메리트입니다. 현재 주가가 올랐더라도, 싼 가격에 주식을 살 수 있다면 시세차익으로 돈을 벌 수 있으니까요. 대신 조건이 있습니다. 상법상, 스톡옵션은 회사에서 부여받은 시점을 기준으로 2년 이상 재직해야 행사할 수 있어요. 예를 들어볼게요. 독자님이 ‘어피티 주식을 1만 원에 살 수 있는 스톡옵션’을 받았습니다. 2년 뒤, 어피티가 폭풍 성장해서 주식 가격이 3만 원으로 올랐더라도 독자님은 주식을 1만 원으로 살 수 있어요. 그럼 독자님은 시세보다 훨씬 싸게 주1식을 사고, 다시 시세에 맞게 주식을 팔아서 그 차익으로 돈을 벌 수 있겠죠? 물론, 주식을 싸게 산 뒤에도 앞으로 더 오를 거라고 생각하면 계속 보유할 수 있습니다. 얻는 게 돈뿐만은 아닙니다. 최소한 스톡옵션에 기재된 권리 행사 시점까지는 열심히 일할 동기부여가 될 테니까요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (206, "기업 인수를 목적으로 하는 기업을 뜻하는 단어는?", "투자회사", "스팩", "채권", +"스팩", "스팩(SPAC)은 ‘Special Purpose Acquisition Company’의 줄임말이에요. 그대로 번역하면, ‘기업 인수를 목적으로 하는 기업’을 뜻합니다. +\n스팩이 먼저 주식시장에 상장한 뒤, 상장하지 않은 상태의 기업(비상장기업)을 인수합니다. \n스팩은 ‘긁지 않은 복권’이라고 부르기도 해요. 어느 회사를 인수할지 정해지지 않은 상태에서 공모에 들어가기 때문이에요. +\n스팩이 특정 회사를 인수한다는 설이 돌면 스팩의 주가가 크게 뛰곤 합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (207, "기업을 대량으로 합병하여 경쟁력을 강화하는 조직 변화는?", "메가머저", " 스팩합병", "인수합병", "스팩합병", "스팩(SPAC, Special Purpose Acquisition Company)은 +기업 인수를 목적으로 상장하는 종목입니다. 비상장 회사와 법적으로 합치는 데 필요한 페이퍼 회사예요. +\n투자자들이 돈을 모아 스팩을 주식시장에 상장시킨 뒤 비상장 회사와 합병하고 합병된 기업이 상장회사가 됩니다. 이를 ‘스팩합병’을 통한 상장이라고 해요. +\n지난해 1분기까지 미국에서 스팩 상장은 일반적인 기업공개(IPO) 상장보다 훨씬 쉬웠어요. 하지만 스팩 투자가 과열되자, 미국 당국이 기준을 까다롭게 바꿨습니다. 스팩 투자 열기가 다소 식으면서 미국 스팩에 투자한 우리나라 개인 투자자들이 손해를 보기도 했어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (208, "외국에서 물건을 저가에 대량으로 사다시피 하는 데 사용되는 거래 방식을 말하는 단어는?", "무역", "시간외거래", "무역수석", "시간외거래", "미국 주식 거래 시간은 우리나라 기준으로 오후 11시 30분부터 오전 6시까지입니다. +\n썸머타임(3월 중순~11월 초)에는 거래시간이 1시간씩 앞당겨져요. 우리나라 +\n시간 기준으로 오후 10시 30분부터 오전 5시 사이에 거래할 수 있습니다. +\n국내 주식처럼 미국 시장도 장전, 장후 시간외거래를 할 수 있는데요. 단, 시간외거래가 가능한 프리마켓(pre-market)과 애프터마켓(after-market)의 시간은 증권사마다 차이가 있습니다. \n대부분의 국내 증권사 앱에서는 실시간 시세가 아닌, 15분 지연된 시세를 보여줍니다. 실시간 시세를 보여주는 별도의 앱이나 웹에서 정보를 얻어야 해요.", "MUL", 1000000, 100000, FALSE); + +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (209, "기업의 재무 situation을 분석하여 그 신뢰도를 판정하는 것은?", "자금 조달", +"상품 가격 결정", "투자 심사", "신용평가", "개인의 신용도를 평가하는 곳은 크게 두 종류가 있습니다. 하나는 NICE 평가정보, KCB, SCI평가정보와 같은 신용평가사. 다른 하나는 은행, 카드사, 보험사와 같은 금융회사예요. +\n금융회사는 고객이 신규로 금융상품에 가입하거나 이용할 때 신용을 평가합니다. 평가정보를 +바탕으로 ‘상품에 가입할 자격이 되는지’, ‘지금 조건대로 이 상품을 계속 이용할 수 있을지’를 판단해요. +\n금융회사와 신용평가사는 신용정보에 대한 모든 걸 관리 및 수집하고 전달하는 비영리 사단법인인 ‘신용정보원’으로부터 신용정보를 가져옵니다. 이 데이터를 갖고 각 회사의 자체 신용평가모델로 평가해요. +\n‘어디에서 신용등급을 조회하는지’, ‘어떤 은행에서 대출심사를 받는지’에 따라 신용등급과 대출금리, +대출한도가 다르게 나오는 이유가 이것 때문입니다. 같은 사람, 같은 신용정보라고 해도 ‘어디에서 평가하는지’에 따라 적용되는 신용평가모델이 다르니 결과가 다르게 나오는 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (210, "“경제활동인구” 중에서 ‘실업자’가 차지하는 비율을 뜻하는 단어는?", "고용률", " 실업률", "취업률", "실업률", "실업률은 ‘경제활동인구’ 중에서 ‘실업자’가 차지하는 비율을 말해요. 경제활동인구는 ‘만 15세 이상 만 60세 미만 인구 중 경제활동 의사가 있는 사람’의 수예요. 쉽게 말해, 일할 의사가 있지만 직장을 찾지 못한 사람들의 비율이 실업률입니다. 반면 고용률은 경제활동인구든 비경제활동인구든 상관없이 ‘만15세 이상 64세 미만 생산가능인구 중 취업자가 차지하는 비율’을 말해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (211, "실적이란 무엇을 의미하는가?", "예상 수요", "실제 성과", "시장 가치", "실제 성과", "기업들의 실적은 분기별로 발표되는 분기보고서, 연간으로 발표되는 사업보고서에서 확인할 수 있어요. 보고서에서 핵심은 ‘재무제표’입니다. +\n4분기 보고서를 제외하고는 모두 각 분기가 마감되는 날짜로부터 45일 이내로 분기 보고서를 제출해야 해요. +\n연초에는 전년도 사업 실적을 ‘사업보고서’로 발표하고, 외부 감사를 받은 뒤 ‘감사보고서’를 제출하는 일정 때문에 굉장히 바쁩니다. 그래서 4분기 보고서는 제출 기한을 두 배(90일)로 줘요. \n2분기 실적의 경우, 1년의 반이 지난 시점에 발표되는 실적 보고서라서 ‘반기보고서’라고도 불립니다", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (212, "기업이 분기별로 실적을 발표할 때, 시장의 기대에 못 미치는 수준으로 실적이 낮게 나오면 “어싱”이라 하는 것은?", "어닝서프라이즈", "어닝쇼크", "경영위기", "어닝쇼크", "‘어닝 (earning)’은 수입, 벌이라고 이해하면 돼요. 기업이 분기별로 실적을 발표할 때, 시장의 기대 이상으로 실적이 좋게 나오면 ‘어닝 서프라이즈’, 기대에 못 미치는 수준으로 실적이 낮게 나오면 ‘ 어닝 쇼크’라고 표현해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (213, "역직구는 무엇을 의미할까요?", "직접 판매", "역직구", "소비자 보호", "역직구", +"우리나라 소비자들이 해외 온라인 쇼핑몰에서 직접 물건을 구입해 들여오는 행위를 직접 구매(직구) 라고 합니다. 우리나라에 정식 유통되는 상품보다 저렴하거나, 우리나라에 유통되지 않는 물건을 구매할 수 있는 장점과 관세 등 행정처리를 직접 해야 하는 불편함이 있어요. 역직구는 우리나라에서 구입할 +수 있는 상품을 외국 소비자에게 직접 판매하는 거예요. 역직구 플랫폼에 입점해 셀러가 된 다음, 내가 직접 상품을 골라 판매합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (214, "월정액을 정하여 지속적으로 저축하는 계좌를 말하는 단어는?", "은행대출", " 연금저축계좌", "투자신탁", "연금저축계좌", "개인연금의 대표 상품으로는 연금저축신탁(은행), 연금저축보험(보험사), 연금저축펀드(증권사)가 있는데, 이 세 가지를 묶어 ‘연금저축계좌’라고 불러요. \n그리고 IRP, 퇴직연금 DC형, 연금저축신탁, 연금저축보험, 연금저축펀드를 묶어 ‘연금계좌’라고 부릅니다. +\n연금계좌는 국민들의 노후 자금 형성을 독려하기 위한 목적이지만, 투자자들에게 큰 절세 효과도 +주고 있습니다. + +\n원금을 지키는 목적이 크다면 연금저축신탁 또는 연금저축보험을, 적극적인 운용을 원한다면 연금저축펀드를 선택하는 것이 좋습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (215, "운송 수단의 가격을 저렴하게 조정하여 물품 배송 비용을 줄이는 방식을 말하는 단어는?", "자율화", "연료비 연동제", "물류 최적화", "연료비 연동제", "연료비 연동제는 3 개월마다 석탄, 석유, 액화천연가스(LNG) 등 연료 가격의 변동분을 전기요금에 반영하는 제도입니다. \n발전소에서 전기를 생산할 때 필요한 석탄, 석유 등 연료의 가격은 수요와 공급에 따라 그때그때 달라요. +\n연료비 연동제를 적용하면 연료 수입 비용이 저렴할 때는 전기요금이 낮아지고, 비용이 오르면 전기요금이 높아져요. +\n한국전력은 연료비 상승으로 전기요금에 대한 부담이 갑자기 커지지 않도록 요금 상승 폭을 조절하고 있어요. 다만 요금을 인상하지 않으면 한국전력의 적자가 더 커진다는 점도 고려할 요소입니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (216, "기업의 경영을 통해 얻는 수익을 계산하려면 무엇을 차감해야 하나?", "재무제표", +"사업수입", "경쟁자 분석", "영업이익", "매출액 = 판매량 X 가격 +\n만약에 어피티가 1만 원짜리 다이어리를 만들어서 100권을 팔았다면, 이렇게 번 돈 100만 원(1만 원 X 100권)을 ‘매출액’이라고 해요. ‘제품 판매량’에 ‘판매가격’을 곱한 것을 의미합니다. \n매출총이익 = 매출액-매출원가 +\n어피티가 다이어리 1권을 만드는 데 들어간 비용(재료비, 인건비, 인쇄비 등)이 3천 원이라고 해볼게요. 총 100권을 팔았으니, 30만 원(3천 원 X 100권)의 비용이 들었겠죠? 손익계산서에서는 이걸 ‘매출원가’라고 합니다. 매출액에서 매출원가를 뺀 금액은 ‘매출총이익’이라고 해요. +\n 판관비 +\n제품(서비스)을 만들었으면 팔기 위해서 제품을 널리 알려야 합니다. 그러려면 기획홍보 담당자( 인건비)도 필요하고, 광고비(판매비)도 들고, 기타 비용(일반 관리비) 등을 지출할 거예요. 이렇게 기업의 판매와 관리, 유지할 때 발생하는 비용을 ‘판관비’라고 불러요. +\n영업이익 = 매출총이익-판관비 +\n‘매출총이익’에서 판관비(판매비, 관리비)를 빼면 ‘영업이익’이 됩니다. 영업이익은 회사가 영업을 통해 얼마를 벌었는지 보여주는 지표이기 때문에 굉장히 중요합니다. 영업이익이 커지면 기업이 경영을 잘했다는 뜻이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (217, "금융회사가 망하면 돈을 돌려받을 수 있는 최대 금액은 얼마입니까?", "2천만 원", +"예금자보호법 5천만 원", "10천만 원", "예금자보호법 5천만 원", "예금자보호법은 내가 돈을 맡긴 금융회사가 망하더라도 원금과 이자를 합해 한 은행당 1인당 최고 5천만 원까지 예금보험공사에서 보호해주는(=돌려받을 수 있는) 법입니다. 금융회사 한 곳이 기준이기 때문에 하나의 한 기관당 5천만 원씩, 여러 곳에 돈을 나눠놓으면 모두 보호받을 수 있어요. 대신, 돈을 ‘즉시’ 돌려받지 못할 수도 있습니다. 금융회사가 망한다는 건 돈을 맡긴 예금자들에게 돌려줄 돈이 없다는 뜻이니까요. 그래도 예금보험공사에서 보장해주기 때문에 최대 6개월 내에는 돌려받을 수 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (218, "은행의 주요 수익모델 중 하나는?", "투자 이익", "예대마진", "이자 이익", " 예대마진", "예대마진(預貸margin)은 예금할 때 ‘예’, 대출할 때 ‘대’, 마진은 ‘차액으로 남긴 이 윤’을 뜻합니다. 대출이자로 얻은 수입과 예금금리로 나간 지출의 차액으로 남긴 마진이라는 뜻이에요. 예대마진은 은행의 주요 수익모델입니다. 은행 상품을 보면, 대출금리가 예금금리보다 높아요. 이 차이만큼 은행이 마진을 가져가는 거예요. 이자를 통해 남기는 이익이기 때문에 예대마진을 다른 말로 ‘이자 이익’이라고도 부르는데요. 우리나라 은행은 이자 이익이 전체 수익원의 80% 이상이에요. 다른 나라 은행과 비교해보면 굉장히 큰 비중을 차지하는 편이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (219, "외자판호는 한국 게임이 중국에 출시될 때 필요한 무엇을 의미합니까?", "콘텐츠 허가", "외자판호", "중화권 매출", "외자판호", "외자판호는 외국 게임이 중국에 출시될 때 필요한 인허가권입니다. 이 이슈를 이해하려면 2016년으로 시간을 돌려봐야 해요. 지난 2016년, 한국의 사드 배치 발표로 중국 정부는 ‘한한령(중국 내 한류 금지령)’을 내리게 됩니다. 중국인 관광객들의 한국 방문을 통제하거나 한국 상품 수입을 규제하는 등 다양한 방식으로 압박해왔죠. 콘텐츠 전반에 한한령이 + +적용되면서, 국내 게임시장도 시련을 겪게 됩니다. 중국에 게임을 서비스하고, 수익활동을 하려면 ‘ 외자판호’가 필요한데 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임시장에서 중화권 매출이 절반 이상을 차지했습니다. 2020년부터는 조금씩 외자판호를 발급받는 사례가 나오기 시작했습니다. 하지만 여전히 희귀한 수준이라서, 외자판호 발급에 성공한 게임사의 주가는 급등세를 보이곤 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (220, "정부가 중앙은행이나 다른 나라의 국립은행에 넣어둔, 외국 돈으로 된 자산의 총 가치를 ‘__________’이라고 부른다.", "국제수지 적자 보전", "외환보유액", "국민연금", " 외환보유액", "개인이 은행에 돈을 저축하고, 회사가 이익금에 자본을 쌓는 것처럼 정부도 여유자금을 저장해 둡니다. 그중에서도 정부가 중앙은행이나 다른 나라의 국립은행에 넣어둔, 외국 돈으로 된 자산의 총 가치를 ‘외환보유액’이라고 불러요. 정부가 여유자금으로 갖고 있는 외화는 달러, 유로화, 위안화, 엔화 등으로 국제무역에 자주 사용된다는 공통점이 있습니다. 외환보유액의 목적은 크게 네 가지예요. 1 국제무역에서 적자가 날 경우, 그만큼 채우고(국제수지 적자 보전) 2 외국에서 빌려온 돈의 원리금을 갚고 3 환율이 너무 떨어지거나 올라가면 외환시장에 개입해 방어하고 4 우리나라에 투자하려는 개인과 회사에 신용도를 쌓는 것이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (221, "은행에서 정한 금리를 기준으로 추가로 금리 더하거나 빼서 조정할 수 있는 금리는?", "예금금리", "우대금리", "대출금리", "우대금리", "우대금리는 가감조정금리라고도 부릅니다. 은행에서 정한 금리를 기준으로 추가로 금리 더하거나(가), 빼서(감) 조정할 수 있는 금리거든요. 은행과 같은 계열의 카드사에서 카드를 만들거나 은행 계좌에서 공과금을 납부하는 등 조건을 맞추면 우대금리를 제공합니다. 예금금리를 연 0.1% 인상해주거나 대출금리를 연 0.2% 내리는 식이에요. 특판 적금, 대출 상품을 자세히 살펴보면 우대금리를 적용해서 ‘최대’, ‘~부터’ 같은 단어가 붙어있습니다. 적금은 이자를 많이 받을수록 좋으니 최대 금리를 적어놓고, 대출은 이자 부담이 적을수록 좋으니 최저 금리를 적어놓은 거예요. 브랜드 세일 광고에 최대 할인율을 적어두는 것처럼 고객 입장에서 최대 혜택을 받을 수 있는 금리를 보여주는 것과 비슷합니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (222, "임직원들이 좋은 조건에 주식을 살 수 있도록 혜택을 주는 제도는?", "상장제", " 우리사주", "퇴직금 지급", "우리사주", "‘우리사주’는 말 그대로 우리 회사의 주식입니다. 임직원들이 자기 회사 주식을 좋은 조건에 살 수 있도록 혜택을 주는 제도예요. 우리나라에서는 기업이 상장하거나 유상증자를 할 때 새로 발행하는 주식 물량의 20%를 우리사주조합에 배정하게 돼 있습니다. 상장이나 유상증자 직후, 주가가 엄청나게 상승하면 주식을 팔아 수익을 내겠다고 생각할 수 있는데요, 이러기가 힘듭니다. 우리사주는 보호예수가 적용되기 때문에 일정 기간 처분할 수 없어요. 보호예수 기간이라도 우리사주를 처분하는 방법이 있습니다. 퇴사하는 건데요. 퇴사하면 주식이 한 달 후에 들어와서 처분할 수 있어요. 실제로 시세 차익을 위해 임직원이 사표를 내기도 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (223, "투자에 대한 우선순위를 정할 때 가장 먼저 고려해야 하는 것은 무엇일까?", "채무", "우선주", "가치", "우선주", "우선주는 보통주에 비해서 특정한 우선권을 부여한 주식입니다. 일반적으로 거래하는 ‘보통주’ 뒤에 ‘우’를 붙여서 표현해요. ‘삼성중공업’은 보통주, ‘삼성중공업우’ 는 우선주. 이런 식이에요. +\n우선주의 큰 특징은 1 보통주와 달리 주주총회에서 의결권을 행사할 수 없다, 2 그 대신 +보통주보다 배당수익률이 높다, 3 ‘일반적으로’ 보통주보다 주가가 40% 정도 낮고, 발행 주식 수가 적다는 점입니다. +\n이 중 3이 우선주의 괴리율을 크게 올려놓곤 합니다. 이슈가 생겼을 때 보통주보다 우선주에 수요가 몰리면서 거래량이 크게 늘고, 주가가 급등하는 식이에요. 우선주 급등 현상이 꾸준히 연출되자, 한 증권사 리포트에서는 ‘비정상의 구조화’라고 표현했어요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (224, "월세로 거주하는 사람들에게 적용되는 세액 공제 중 하나는?", "소득세 공제", " 월세세액공제", "부동산세 공제", "월세세액공제", "1년 동안 받은 총 급여액이 7천만 원 이하에 월세로 거주하면서, 세부 조건을 만족시키면 월세액 세액공제를 받을 수 있습니다. 세액공제 금액 예를 들어 볼게요. 총 급여액 3천만 원에, 매달 50만 원의 월세를 낸 경우예요. 이 경우, 월세세액공제를 적용받아 월세의 1.5배 정도 되는 72만 원을 아낄 수 있습니다. 월세세액공제를 받기 위해서는 무주택 세대주인지, 월셋집의 면적이 얼마나 되는지 등 조건을 따져봐야 해요. 조건에 맞으면 증빙서류를 준비해서 회사에 제출해야 합니다. 증빙 서류는 주민등록등본, 임대차 계약서 사본, 월세액 이체증( + +은행 등 금융기관에서 발급)이 있습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (225, "회사가 돈이 부족해질 때, 기업을 운영하는 데 필요한 금액을 구입하기 위해 가장 일반적인 방법은 무엇입니까?", "대출", "유상증자", "투자", "유상증자", "회사를 운영하다 보면 돈이 부족해질 때가 있습니다. 당장 사업을 유지하기에도 부족한 상황일 수도 있고, 사업을 좀 더 확장하기 위해 투자할 돈이 부족한 상황일 수도 있겠죠. 자금 조달 방법은 크게 두 가지입니다. 첫 번째 방법은 대출을 받는 거예요. 우리가 필요할 때 개인대출을 받는 것처럼, 기업도 기업대출로 돈을 끌어올 수 있습니다. 은행과 같은 금융회사를 매개로 하므로 ‘간접 금융’이라 불러요. 두 번째 방법은 기업이 직접 증권(채권, 주식)을 발행하는 ‘직접 금융’입니다. ‘지금 돈 빌려주면 나중에 이자 쳐서 갚을게~’ 약속하면서 채권을 발행하거나, 주식을 더 발행해 파는 방법이 있습니다. 이 중에서 후자를 ‘증자’라고 부릅니다. 일반적으로 증자라고 하면 유상증자를 말합니다. 회사가 돈이 필요할 때, 주식을 더 발행해 불특정 다수에게 파는 거예요. 대략 이런 시나리오예요. 회사마다 유상증자를 해야 하는 이유, 유상증자로 신주를 얻는 주체, 유상증자의 결과가 다 다르기 때문에 주주에게 호재일지, 악재일지는 잘 따져봐야 합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (226, "기업이 일정한 기준에 따라 일정한 물량의 재고를 보유해야 하는 조건을 뜻하는 단어는?", "자율납품", "의무보유확약", "예상수요", "의무보유확약", "의무보유확약은 어떤 것을 ‘의무’적으로 ‘갖고 있도록’ ‘확’실하게 ‘약’속하는 것을 뜻합니다. 주식시장에서는 주식을 팔지 않고 보유하고 있겠다는 약속을 뜻해요. +\n기업이 상장하기 전, ‘수요예측’이라는 절차가 있어요. 은행이나 증권사, 보험사, 연기금 등 기관투자자를 통해 투자 수요를 예측하는 단계입니다. “우리 회사가 상장하면 한 주당 얼마에, 몇 주 살래?”하고 물어보는 과정이라 생각하면 돼요. +\n수요 예측이 끝나면 기업과 상장주관회사가 협의를 통해 공모주 가격을 결정합니다. 그리고 각 기관투자자에게 몇 주씩 줄지 ‘배정 물량’을 결정하게 돼요. +\n이때 각 기관투자자가 어떤 기업인지(투자성향, 공모주 참여실적 등), 공모주 가격을 얼마로 제시했는지, 의무보유기간은 얼마간으로 잡았는지 고려합니다.", "MUL", 1000000, 100000, +FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (227, "금융시장에서 아직 선진국은 아니지만 빠르게 경제 발전하고 해외 자본에 시장을 열기 시작한 국가들을 어떤 이름으로 부릅니까?", "강성국가", "이머징 마켓", "정책국가", "이머징 마켓", +"이머징마켓은 금융시장에서 자주 사용되는 용어예요. 아직 선진국은 아니지만 급격한 경제 발전과 함께 해외 자본에 시장을 열기 시작한 국가들을 ‘이머징마켓’이라고 부릅니다. 이머징마켓 투자는 고위험 고수익이라는 특징이 있어요. 우리나라는 아직 이머징마켓으로 분류되는데, 계속해서 선진국 시장에 편입되려고 노력하는 중이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (228, "일정 기간이 지나면 효력이 상실되는 제도를 뜻하는 단어는?", "소득공제", "일몰제", +"소비자보호법", "일몰제", "일몰제는 해가 어느 시점에 지는 것처럼, 일정 기간이 지나면 효력이 상실되는 제도를 뜻해요. 일몰제로 효력이 상실될 시기가 다가올 때, 정부는 해당 제도의 일몰 시한을 연장하기도 합니다. 신용카드 등 사용금액에 대한 소득공제의 경우, 10번 가까이 기한이 연장됐어요.", +"MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (229, "임상시험 절차를 통과한 후 시판 허가를 받은 신약을 개발에 성공했다는 것을 뜻하는 단어는?", "신약 개발", "임상시험", "의료기자", "임상시험", "‘신약 개발에 성공했다’라는 건 임상시험 절차를 통과해 시판 허가를 받았다는 것을 뜻합니다. 여기서 시판 허가를 받기 전 단계를 크게 ‘전 임상시험’, ‘임상시험단계’로 나뉩니다. 그중에서도 임상시험단계는 총 3상으로 나뉘어요. 각 단계를 통과하는 데 시간이 오래 걸리고, 성공 확률도 높지 않아 도중에 실패하는 경우가 대부분입니다. 국내 제약업계에서 개발에 성공한 신약은 지난 25년간 약 30개뿐이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (230, "제정된 법률을 미리 알리려는 의도에 따라 공표하는 것을 뜻하는 단어는?", "자유의 형언", "입법예고", "국제협정", "입법예고", "정책 관련 뉴스를 볼 때는 ‘정책이 어떤 단계에서 논의되고 있는지’ 확인해야 합니다. +\n‘발의됐다’라고 하면 국회에서 어떤 정책의 필요성에 대한 이야기가 나왔다는 뜻입니다. + +\n‘발의된 법안이 의결됐다’라고 하면 그 이야기대로 정책을 만들겠다는 뜻입니다. 실무 관련 구체적 내용은 정해지지 않은 단계예요. +\n법안이 의결되면 법제처로 넘어갑니다. 법제처는 정책을 어떻게 법으로 만들지 고민한 다음, 실생활에 적용하도록 법령을 만들어 ‘입법예고’를 해요. +\n즉, 발의-의결-입법예고가 모두 끝나야 하나의 법이 만들어집니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (231, "전후방산업에 속하는 산업의 특징은 무엇입니까?", "최소한의 노동 투입을 필요로 하는 산업", "후방산업과 연관효과가 크며 최종 소비자에 가까운 산업", "자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업", "후방산업과 연관효과가 크며 최종 소비자에 가까운 산업", "전후방산업 기업활동에서 부가가치가 생산되는 과정을 가치사슬이라고 해요. 땅 속에 묻혀 있던 철광석을 캐내서 철강으로 만들면 철광석으로 존재할 때보다 부가적인 가치가 더해지는 식입니다. 전방산업은 용도가 특정되며 최종 소비자에 가까운 산업이에요. 후방산업은 자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업입니다. 자동차 산업이 제조업의 꽃이라고 불리는 이유는 최종 전방산업으로서 후방산업과 연관효과가 무척 크기 때문이에요. 수많은 고용과 부가가치를 창출하는 산업이에요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (232, "조각투자가 일반적으로 적용되는 대상은?", "선박과 대출채권", "부동산이나 저작권, 미술품 등 자산", "투자 플랫폼", "부동산이나 저작권, 미술품 등 자산", "실물을 쪼개 소액으로 투자하는 방식을 조각투자라고 해요. 가치 상승이 기대되는 자산의 소유권을 여러 명이 공동투자해 수익을 분배하는 투자 방식입니다. 투자 대상으로 부동산이나 저작권, 미술품은 물론 선박과 대출채권 등이 있습니다. 실물자산에 대한 일부 권리도 가질 수 있습니다. 실제 10억 원짜리 건물에 만 원을 투자한다면, 건물의 만 원어치 일부를 소유할 수 있습니다. 아주 소액이지만 건물주가 될 수 있는 셈이죠. 하지만 여전히 위험은 있습니다. 현물의 가치를 제대로 산정해야 하고, 중간에 사업자가 파산하거나 거래플랫폼이 도산하면 투자금을 날릴 수 있어요. 투자자 보호를 약관에 명시하는 등 믿을 만한 플랫폼을 골라야 하고, 내가 투자하려는 실물에 대한 지식이 어느 정도 요구됩니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (233, "기업의 경영 방침을 결정하는 중요한 회의는 무엇입니까?", "이사회", "주주총회", +"창업자 총회", "주주총회", "주주총회는 주식회사의 주주가 모여서 회사의 중요한 사안을 결정하는 의사결정회의를 뜻합니다. +\n설명이 어렵지만, 학급 회의와 크게 다르지 않습니다. 학급과 관련된 주요 안건을 두고 찬반 투표를 하고 의견을 나눴던 것처럼 주주총회에서도 회사와 관련된 주요 안건을 의논해 결정해요. \n주식회사라면 매년 최소 한 번 이상 주주총회를 개최합니다. 회사는 매년 1년 동안의 사업을 결산해 ‘결산 재무제표’를 만드는데요. 주주가 이 재무제표를 승인해줘야 확정할 수 있거든요. 이외에도 회사와 관련된 중요한 사안들을 싹 모아서 ‘정기 주주총회’를 여는 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (234, "주택을 국가에 담보로 맡기고 평생 일정한 금액을 받는 상품은?", "주택자금", " 주택연금", "주택가입", "주택연금", "주택연금은 현재 거주 중인 집을 국가에 담보로 맡기고 매달 연금으로 일정한 금액을 평생 받을 수 있는 상품입니다. 월 지급액은 가입자의 연령, 주택의 시장 가격, +이자율 등을 고려해서 산정해요. 다른 조건이 동일할 때, 주택의 시장 가격이 높을수록 월 지급액이 높아져요. 주택연금은 2019년 가입연령이 60세에서 55세로 하향됐어요. 가입 가능한 주택 가격 요건도 ‘시가 9억 원 이하’에서 ‘공시지가 9억 원 이하’로 완화됐습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (235, "생산 과정에 투입물로 사용하는 재화예요. 원자재와 다른 점은 한 번 가공을 거친 상태라는 점이에요. 이 말을 가장 잘 설명하는 단어는?", "원자재", "제품", "소비재", "중간재", +"생산자가 생산 과정에 투입물로 사용하는 재화예요. 원자재와 다른 점은 중간과정에 사용하기 위해 한 번 가공을 거친 상태라는 점이에요. 예를 들어, 철광석은 원자재지만 철광석을 녹여 만든 철판은 중간재라고 할 수 있어요. 중간재는 상품을 만들 때 최종소비자가 사는 완성된 결과물과도 다릅니다. 중간재인 철판은 최종소비자가 사용하기 어렵고, 자동차나 배를 생산하는 기업이 구매해 사용해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, + +option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (236, "자산의 가치가 줄어드는 것을 고려해야 하는 계정 처리 방식은?", "재고처리", " 감가상각", "인수합계", "감가상각", "누군가 사용하던 중고 물품을 정가와 동일한 가격에 구매하는 사람은 드물 거예요. 사려는 사람은 많은데 공급은 적어 프리미엄이 붙는 특수한 경우를 제외하면, 대부분의 상품은 개봉과 동시에 정가보다 낮은 가격에 거래됩니다. 심지어 포장을 뜯지 않았다고 해도 원래 가격보다는 낮은 가격에 거래되기 마련이죠. 누구나 새 걸 좋아하니까 생기는 일이에요중고 거래 가격은 소비자의 선호 체계를 고스란히 반영합니다. 구체적으로 세 가지 이유로 설명할 수 있습니다. \n효용 극대화: 새 상품 구매가 훨씬 더 기분 좋아요. ‘새 상품을 샀을 때보다 덜 좋은 기분’이 중고 거래가에 반영돼요. +\n정보의 비대칭성: 내가 알지 못하는 다른 사람의 손에 들어갔던 물건은 어떻게 다뤄지고 변화했는지 알 길이 없습니다. 이전 소유자가 기업이나 판매자보다 깔끔하게 상품을 관리할 가능성은 아주 적어요. ‘불확실성 감당 비용’이 중고 거래가에 반영됩니다. +\n손실 회피: 중고 제품은 환불이나 A/S 등 그 상품을 제조하고 판매한 기업의 서비스 제공 범위에서 벗어나 있을 가능성이 큽니다. 잠재적인 문제 발생 가능성도 중고 거래가격 책정에 반영됩니다. \n이런 경향을 한마디에 눌러 담은 것이 바로 감가상각이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (237, "이론적으로 경제가 인플레이션과 디플레이션이 없는 상태에서 금리를 정하려고 하는 것이 무엇일가?", "고정금리", "중립금리", "물가지수", "중립금리", "중립금리는 이론적으로 경제가 인플레이션(물가 상승)이나 디플레이션(경기 침체) 압력이 없는 잠재성장률 수준을 유지하게 만드는 이론적인 금리 수준이에요. 금리가 너무 높지도, 낮지도 않은 것을 뜻하죠. 중립금리는 절대적으로 정해진 수치가 아니라 그때그때 경제 상황에 따라 달라져요. 경제가 완전고용 상태이고 물가수준이 안정적인 상태에서 돈의 수요와 공급이 균형을 이뤄야 하니까요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (238, "우리나라에서 일반적으로 사용하는 화폐와는 다른 결제수단은?", "한국은행권", " 지역화폐", "현금", "지역화폐", "지역화폐는 백화점 상품권과 같은 일종의 ‘유가증권’입니다. +현금처럼 사용할 수 있는 결제수단 중 하나지만, 일반적으로 사용하는 화폐와는 달라요. 우리가 흔히 쓰는 1천 원, 1만 원 권과 같은 화폐는 한국은행이 발행하는 한국은행권입니다. 국가에서 법으로 공식 인정한 화폐인 한국은행권과는 다르게, 지역화폐는 지자체에서 마련한 조례에 따라 발행, 유통되기 때문에 조례에서 허용하는 범위 내에서만 사용할 수 있어요. 주로 지역상권 활성화, 지역 공동체 +강화를 위한 목적으로 활용되고 특정 지역 내에서 제한된 구성원끼리 사용할 수 있습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (239, "기업이 직원을 고용할 때 지불해야 하는 최소한의 임금을 뜻하는 단어는?", " 최고임금", "최저임금", "평균임금", "최저임금", "최저임금은 최저임금위원회의 논의 및 의결을 통해 결정됩니다. 매년 4월경에 논의를 시작해 6월 말~7월 초·중순에 합의된 안을 발표하곤 해요. \n구체적으로는 ‘고용노동부 장관이 최저임금위원회에 최저임금을 심의 및 의결하는 것을 요청한 시점’ 을 기준으로 90일 이내에 결정해야 돼요. +\n고용노동부 장관은 매년 3월 31일에 심의를 요청하고 있습니다. 그래서 원칙적으로는 6월 말까지 의결이 완료되어야 하지만, 경영계와 노동계의 입장이 좁혀지지 않으면 7월까지 넘어가기도 해요. \n최저임금위원회가 내년도 최저임금에 대해 결론을 내리고 나면, 고용노동부 장관이 8월 5일까지 결정된 내용을 발표합니다. 이때 고시된 최저임금의 효력이 다음 해 1월 1일부터 발생해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (240, "추가예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하는 단어는?", +"예산", "추기", "경정", "추경", "추경은 ‘추가경정예산’의 줄임말이고, 경정(更正)은 ‘바르게 고친다’라는 뜻이에요. 추가경정예산은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하죠. 연초에 세운 계획보다 돈을 더 쓰겠다는 건데요. 추경안은 자연재해나 큰 사고가 나서 인프라와 사회를 복구해야 할 때 나옵니다. 그래서 지난 추경안 규모를 보면 굵직한 경제적 충격들을 읽을 수 있어요. 추경 규모가 10조 원을 넘는 곳(빨간색 그래프) 은 리먼브라더스 사태가 촉발한 세계 금융위기, 브렉시트 등 우리나라뿐만 아니라 세계적인 경제 위기가 있었던 시기입니다. 그중에서도 2020년과 2021년의 추경 횟수와 금액은 ‘역대급’이니, 코로나19가 세계적으로 얼마나 커다란 경제적 충격을 가져왔는지 알 수 있어요. 사실 추경 자체가 엄청나게 특별한 일은 아닙니다. 우리나라뿐만 아니라 전 세계 국가 대부분이 매년 추경을 실시합니다. 돈 쓸 일이 너무 + +많다 보니 1년 동안 얼마가 필요할지 정확하게 예측하기가 어렵거든요. 돌발사태가 발생하기도 하고요. 국가가 사업을 집행하는 데는 국민의 세금이 사용됩니다. 그래서 국민의 대리인인 국회의원과 정당이 추가예산이 필요하다는 행정부를 상대로 견제하기 시작합니다. ‘추경을 하느냐, 마느냐’보다는 추경 횟수와 액수 등을 두고 다투죠. 일명 ‘감액심사’라고 해요. 정치적 이해관계에 따라 여당이 행정부 편을 많이 들어주기도 하는데요. 보통 매년 추경을 하기 때문에 ‘필요하다’라는 쪽으로 결론이 나긴 합니다. 하지만 모든 추경안이 실행되는 건 아니에요. 예를 들어 어떤 정당이 추경을 해야할 만큼 꼭 필요한 사업이라고 생각하지 않고, 이들의 주장이 국회 다수결로 지지를 받는다면 추경안은 실행되지 않습니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (241, "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장을 멈추는 구간을 무엇이라고 하나요?", "성장폭", "캐즘", "마이그레이션", " 캐즘", "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장이 잠시 멈추는 구간을 ‘캐즘(Chasm)’이라고 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (242, "코스피 지수가 나타내는 것은?", "금리", "주가지수", "환율", "주가지수", " 금융시장에서 ‘인덱스’는 ‘지수’를 뜻합니다. 여기서 ‘지수’는 IQ지수, BMI지수, 행복지수, 빅맥지수에 등장하는 것과 같은 개념이에요. ‘주가지수’는 주식의 가격을 ‘지수화’한 걸 의미하죠. \n우리나라 대표 주식시장인 유가증권시장에서는 유가증권시장은 ‘(현재 시점에서, 주식시장에 상장된 기업의 시가총액을 모두 합친 것) ÷ (과거의 특정 시점에서, 상장된 모든 기업의 시가총액을 모두 합친 것) x 100’으로 지수를 산출합니다. +\n‘과거의 특정 시점’은 고정돼있습니다. 유가증권시장은 1980년 1월 4일이 기준이에요. 이렇게 1980년 1월 4일과 현재를 비교하는 지수화 작업을 통해 산출한 숫자를 한국종합주가지수(KOrea Composite Stock Price Index)라고 부릅니다. 약자인 KOSPI, 코스피가 더 익숙할 거예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (243, "코스피200를 구성하는 주식의 수는?", "코스다이", "코스피200", "코스트500", "코스피200", "코스피200은 유가증권시장에 상장된 기업 중, 시가총액 등을 기준으로 상위 200개 기업의 주식을 지수화한 것을 뜻합니다. +\n유가증권시장에 상장된 모든 기업의 주식을 지수화한 KOrea Composite Stock Price Index( 한국종합주가지수), 즉 KOSPI와는 다른 지수예요. 일종의 우등생 클럽이라고 보면 됩니다. +\n한 국가의 대표 지수에 새롭게 편입되는 일은 기업에 큰 호재입니다. 국내외 투자자들이 많이 참고하는 지표인데다, 지수의 움직임을 따르는 펀드의 규모도 상당하거든요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (244, "한 시간 안에 다양한 제품을 배송하는 서비스를 뜻하는 단어는?", "온라인 커머스", +"퀵커머스", "당일배송", "퀵커머스", "퀵커머스는 ‘퀵’(Quick)과 상거래 ‘커머스’(Commerce)의 합성어입니다. 음식 배달을 넘어 화장품이나 책, 약 등 다양한 제품을 1시간 안에 배송하는 서비스를 뜻해요. 온라인 커머스 시장의 당일배송이나 새벽배송보다 한 단계 진화된 형태예요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (245, "통화 가치가 높으면 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있는 경우는?", "인플레이션", "킹달러", "환율", "킹달러", "달러 가치 초강세 현상을 뜻합니다. 2022년 미국 달러 가치는 20년만에 최고 수준으로 올랐는데, 미국 연방준비제도( 연준)가 인플레이션을 잡기 위해 금리를 급격하게 올렸기 때문이에요. 통화 가치가 높다면 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있어요. 반대로, 다른 나라의 통화 가치가 높아지면 환전할 때 우리나라 입장에서는 그 나라의 통화가 비싸지게 됩니다. 값비싼 통화를 사야 하니까요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (246, "어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상을 뜻하는 단어는?", "경기활성화", "타임래그", "물가인플레이션", "타임래그", "타임래그(time-lag) 는 우리나라 말로는 ‘시간차’입니다. 어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상을 뜻해요. 경제학에서도 타임래그 현상을 종종 볼 수 있어요. 예를 들어, + +기준금리를 낮추기로 결정한 뒤, 시장에 유동성이 풍부해지며 경기가 활성화되고 물가가 오르는 것도 시간차를 두고 발생하는 식이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (247, "자동차 제조 회사의 경쟁 요인을 설명하는 단어는?", "생산비용", "테슬라요건", " 가격경쟁", "테슬라요건", "테슬라 요건의 정식 명칭은 ‘이익 미실현 기업 특례 상장’이에요. \n테슬라 요건은 상장 요건에 미달하더라도 성장성이 높은 기업이 상장할 수 있도록 만든 특례 제도입니다. +\n미국 기업 ‘테슬라’가 적자였음에도 나스닥에 상장한 후 크게 발전한 사례에서 따와 ‘테슬라 요건’ 이라는 이름이 붙었습니다. +\n우리나라는 2017년부터 테슬라 요건을 적용하고 있어요. +\n국내에서 테슬라 요건으로 최초 상장한 기업은 온라인 상거래 플랫폼 사업을 영위하는 카페24예요.", +"MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (248, "티커의 의미는?", "주식가격", "티커", "시장분석", "티커", "국내 주식을 할 때는 특정 주식을 검색할 때 ‘종목명’이나 ‘종목코드’ 6자리를 입력해요. +\n미국 주식시장은 조금 다릅니다. 종목코드가 대문자 알파벳으로 돼 있거든요. 정식 명칭은 ‘티커 (ticker)’입니다. +\n티커로 주식이 어느 주식시장에 상장했는지도 구분할 수 있습니다. 뉴욕증권거래소에 상장된 종목은 주로 3자리 이내, 나스닥에 상장된 종목은 5자리 이내의 알파벳으로 티커를 정합니다. 테슬라는 +TSLA, 애플은 AAPL이 티커예요. 둘 다 나스닥에 상장된 기업이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (249, "반도체를 설계도 없이 위탁 생산하는 기업은?", "팹리스", "파운드리", "FAB (Fabrication)", "파운드리", "반도체 기업은 크게 세 종류로 나뉩니다. 이중, 파운드리는 팹리스의 설계도를 받아다 주문 들어온 만큼만 반도체를 가공, 위탁 생산하는 기업이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (250, "원유 대금을 결제할 때 미국 달러를-worldwide currency로 만든 시스템은?", " 국제통화체제", "페트로 달러 체제", "글로벌화 경제체제", "페트로 달러 체제", "페트로 달러 체제는 1975년부터 원유 대금을 미국 달러로만 결제하도록 한 시스템으로 미국 달러를 세계 기축통화로 만든 원동력이에요. 페트로 달러 체제는 미국이 사우디 왕실에 전한 은밀한 제안에서 시작했어요. 1975년, 미국은 사우디에 ‘중동 맹주국 지위를 보장할 테니 원유 결제엔 달러화만 쓰라’고 제안했고, 사우디가 받아들였습니다. 이후로 미국은 사우디아라비아의 든든한 우방국으로 자리 잡았어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (251, "근로계약을 할 때 연장·야간·휴일근무를 고려한 연봉 산정 방식은?", "선택적 임금제", "포괄임금제", "기본급제", "포괄임금제", "포괄임금제는 근로계약을 할 때 연장·야간· 휴일근무를 하는 것으로 가정하고 연봉에 관련 수당을 포함하는 임금 산정 방식입니다. 근로시간을 엄격하게 통제하기 힘든 시스템이나 선택적 근무제 등 비교적 자유로운 근무 문화를 가진 회사의 경우 포괄임금제로 연봉을 산정하는 경우가 많아요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (252, "특정 사업을 프로젝트로 진행할 때 사업 자체를 담보로 잡아 돈을 빌리는 방식을 무엇이라 하는가?", "투자 금지", "프로젝트 파이낸싱 (PF)", "경영 위험 방지", "프로젝트 파이낸싱 (PF)", "PF는 프로젝트 파이낸싱의 약자예요. 건설 등 특정 사업을 프로젝트로 진행할 때 이 사업만 담당하는 특수목적법인(SPC)을 세우고, 해당 사업 자체를 담보로 잡아 돈을 빌립니다. 만약 공장 건설 프로젝트를 PF로 진행한다고 하면 이 공장이 앞으로 물건을 생산·판매해 들어올 수익까지도 계산해서 대출을 받을 수 있습니다. 리스크가 상당히 큰 대출 방식이에요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (253, "실업률과 인플레이션 사이에 반비례 관계가 있는 경제학 모형은?", "라자루스 곡선", "필립스곡선", "케인즈 곡선", "필립스곡선", "필립스곡선은 실업률과 인플레이션(물가 상승) 사이 반비례 관계가 있다는 경제학 모형이에요. 여기서 인플레이션은 임금상승률(명목)로 나타냅니다.", + +"MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (254, "여행 패키지 상품 구성을 위해 미리 사둔 항공권을 이용한 전략은?", "비용절감", +"하드 블록", "예산관리 방안", "하드 블록", "여행사가 여행 패키지 상품 구성을 위해 미리 사둔 항공권이에요. 하드 블록 전략을 이용하면 비수기에는 시세보다 다소 비싸게 대량구매를 해두고, 성수기에는 시세보다 저렴하게 대량구매를 해두어 안정적인 여행객 수요 대응을 할 수 있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (255, "한미 금리역전이 발생할 때, 미국의 기준금리가 한국보다 ____________________.", +"낮아진다", "높아진다", "그치않는다", "높아진다", " 한미 금리역전은 미국의 기준금리가 한국보다 높아진 것을 뜻해요. 보통 국가의 신용도가 높을수록 기준금리가 상대적으로 낮아요. 예를 들어 경제규모 세계 1위이자 기축통화국인 미국은 다른 개발도상국보다 낮은 금리를 유지하죠. 우리나라도 보통 미국보다 기준금리가 높고요. 기준금리가 낮다는 건, 해당 국가의 돈값(이자)을 매기는 기준이 다른 국가보다 낮다고 해석할 수 있는데요. 투자자 입장에서는 같은 돈을 미국 달러에 투자했을 때 +받는 돈값이 적더라도, 달러를 매력적으로 느낍니다. 신용도가 높고 경제력이 탄탄해 안전하니까요. 미국보다 상대적으로 금리가 높은 우리나라와 같은 국가도 다른 의미로 매력적인 투자처예요. 상대적으로 높은 금리, 즉 높은 수익률을 제공하기 때문이에요. 그런데 미국이 인플레이션을 해소하기 위해 기준금리를 올리면서, 우리나라보다 돈값을 높게 쳐주기 시작했어요. 안전한데다 금리까지 높다면? 우리나라 금융시장에 투자하던 외국인 투자자들이 돈을 빼서 미국으로 향할 수도 있어요. 물론 그렇지 않았던 사례도 있었지만, 한국과 미국의 금리가 역전되면 대책이 필요하다는 얘기가 나오곤 해요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (256, "한국 게임의 서비스를 중국에 저해하는 조치를 내린 것은?", "사드 배치", "한한령", "중국 관광객 통제", "한한령", "지난 2016년, 우리나라의 사드 배치 발표로 중국 정부는 ‘한한령( 중국 내 한류 금지령)’을 내립니다. 중국인 관광객들의 우리나라 방문을 통제하거나 우리나라 상품 수입을 규제하는 등 다양한 방식으로 압박해왔어요. 콘텐츠 전반에 한한령이 적용되면서 국내 게임업체도 시련을 겪었어요. 중국에 게임을 서비스하고 수익활동을 하기 위해서는 ‘외자판호’가 반드시 필요한데, 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임업체의 매출 중 큰 부분이 중화권 매출이었습니다. 그런데 진출 자체가 막혀버렸으니 엄청난 악재가 될 수밖에 없었어요. 이후 국내 콘텐츠 전반에 적용되던 한한령이 하나둘 풀리기 시작했지만 유독 게임 분야는 규제가 풀리는 속도가 느렸어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (257, "심야 택시를 탈 때 기존 요금에 얼마를 더한 금액을 적용하는 것은?", "할인", " 할증", "추가요금", "할증", "나눌 ‘할(割)’, 더할 ‘증(增)’을 합친 한자어예요. 일정 기준에 +얼마를 더한다는 뜻으로, 영어로는 ‘extra charge’로 번역할 수 있어요. 보통 아래와 같은 상황에서 사용됩니다. 심야 할증: 심야에 택시 또는 고속버스를 이용할 때, 기존 요금에 얼마를 더한 금액을 적용하는 것", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (258, "사회의 이익을 추구하는 투자전략은?", "헤지펀드", "행동주의펀드", "투자전략", +"행동주의펀드", "행동주의펀드는 헤지펀드 중에서도 기업 의결권을 확보할 수 있을 만큼 투자해 기업의 경영에 적극적으로 참여하는 투자전략을 갖고 있는 펀드를 뜻합니다. 행동주의펀드 역시 최대 이익을 추구합니다. 기업의 자산을 매각해 현금흐름을 개선하고 주주배당을 확대하며, 구조조정을 통해 핵심 자산 가치를 불리는 방식을 요구하기도 해요. 행동주의펀드는 기업의 군살을 없애고 주주의 권리를 올리며 기업 수익을 극대화한다는 장점을 갖고 있지만, 기업의 단기적 수익에 집착하다가 본질을 해치고 ‘먹튀’한다는 비판을 동시에 받곤 합니다.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (259, "가족이 함께 생활하는 집을 뜻하는 단어는?", "자산적 주택", "행복주택", "도시 주택", "행복주택", "행복주택은 대학생, 사회초년생, 신혼부부, 고령자 등을 위해 LH가 새로 건설해 공급하는 공공임대주택을 말합니다. +\n특징: 행복주택은 직장과 학교와 가까운 곳(직주근접)이거나 대중교통 이용이 편리한 곳에 위치하고, 주변에 다양한 주민 편의시설을 함께 짓는다고 해요. +\n임대료: 행복주택에도 여러 가지 유형이 있는데요, 유형별 입주자격과 소득·자산기준을 충족할 경우 주변시세 대비 60~80% 저렴한 임대조건으로 입주할 수 있어요. + +\n기간: 행복주택의 총 임대기간은 대학생·청년 6년, 유자녀 신혼부부 10년, 고령자·수급자 20 년으로 설정돼있어요.", "MUL", 1000000, 100000, FALSE); +insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (260, "한 회사의 물건을 다른 회사에 저가에 판매하는 경우 손실을 뜻하는 단어는?", " 자본손실", "환차손", "수익손실", "환차손", "‘환차손’은 환율 변동에 따른 손해를 뜻합니다. 반대말은 ‘환차익’이에요. +\n1,200원을 1달러로 바꾼 그 시점에는 환차손이나 환차익이 발생하지 않아요. +\n1,200원 주고 산 1달러를 다시 우리나라 돈으로 바꿔야 할 때 환율이 변동해 1,000원을 받게 되면 200원의 환차손이 발생하는 거죠. +\n200원은 투자원금 1,000원 기준 20%나 된답니다. 다시 말해, 1달러에 1,200원에서 1,000원이 됐을 때 기준 미국 증시에서 번 돈을 환전해서 실질적인 수익이 나는 시점은 수익률 21%부터인 거예요.", "MUL", 1000000, 100000, FALSE); From ada8cbc8dbc43073ba0ccf3532e8d547600aa53d Mon Sep 17 00:00:00 2001 From: plum-king Date: Sun, 25 Aug 2024 18:37:28 +0900 Subject: [PATCH 07/52] =?UTF-8?q?#21=20Fix=20Quiz=20:=20quiz=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=EC=9C=BC=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/controller/QuizController.java | 2 +- .../finut/finut_server/domain/quiz/Quiz.java | 1 + .../finut/finut_server/service/QuizService.java | 17 +++++++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index e3298de..9855092 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -23,7 +23,7 @@ public class QuizController { @Autowired private QuizService quizService; - @Operation(summary = "퀴즈 내용 불러오기", description = "퀴즈를 보여줍니다.") + @Operation(summary = "랜덤으로 퀴즈 내용 불러오기", description = "퀴즈를 보여줍니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), diff --git a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java index eccde93..3e097a6 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java @@ -8,6 +8,7 @@ @Entity @Builder @Getter +@Setter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index b38d3bb..b1bf5d9 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -16,6 +16,7 @@ import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Optional; +import java.util.Random; @Service @RequiredArgsConstructor @@ -26,8 +27,20 @@ public class QuizService { @Transactional public Quiz getQuiz(){ - LocalDate today = LocalDate.now(); - return quizRepository.findByDate(today); + // displayed == 0 이면 조회 가능 + Quiz quiz; + while(true){ + Random random = new Random(); + Long randomNumber = random.nextLong(260) + 1; // 1부터 260까지의 숫자를 랜덤하게 뽑음 + quiz = quizRepository.findById(randomNumber) + .orElseThrow(() -> new GeneralException(ErrorStatus.INVALID_NUMBER)); + if(quiz.getDisplayed() == 0) { + quiz.setDisplayed(1); + quiz = quizRepository.save(quiz); + break; + } + } + return quiz; } @Transactional From 59827f051aaa7d9dd6b41376603330354c42d3bf Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 27 Aug 2024 03:22:54 +0900 Subject: [PATCH 08/52] =?UTF-8?q?#25=20Update=20User=20:=20=EC=B6=9C?= =?UTF-8?q?=EC=84=9D=20=ED=99=95=EC=9D=B8=20=ED=9B=84,=20=EB=8F=88=20?= =?UTF-8?q?=EC=A7=80=EA=B8=89=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HomeController.java | 4 ++ .../controller/UserController.java | 38 +++++++++++++++++++ .../domain/user/UserRequestDTO.java | 17 +++++++++ .../domain/user/UserResponseDTO.java | 9 +++++ .../finut/finut_server/domain/user/Users.java | 6 +++ .../finut_server/service/UsersService.java | 32 +++++++++++++++- 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/finut/finut_server/controller/UserController.java create mode 100644 src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java diff --git a/src/main/java/com/finut/finut_server/controller/HomeController.java b/src/main/java/com/finut/finut_server/controller/HomeController.java index de96968..b381de3 100644 --- a/src/main/java/com/finut/finut_server/controller/HomeController.java +++ b/src/main/java/com/finut/finut_server/controller/HomeController.java @@ -3,6 +3,9 @@ import com.finut.finut_server.apiPayload.ApiResponse; import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.config.auth.dto.SessionUser; +import com.finut.finut_server.converter.QuizConverter; +import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.domain.user.UserResponseDTO; import com.finut.finut_server.service.UsersService; import io.swagger.v3.oas.annotations.Operation; @@ -18,6 +21,7 @@ import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/com/finut/finut_server/controller/UserController.java b/src/main/java/com/finut/finut_server/controller/UserController.java new file mode 100644 index 0000000..947a3f2 --- /dev/null +++ b/src/main/java/com/finut/finut_server/controller/UserController.java @@ -0,0 +1,38 @@ +package com.finut.finut_server.controller; + +import com.finut.finut_server.apiPayload.ApiResponse; +import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; +import com.finut.finut_server.domain.user.UserRequestDTO; +import com.finut.finut_server.domain.user.UserResponseDTO; +import com.finut.finut_server.service.UsersService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "User Controller", description = "사용자 관련 api") +@RequestMapping("/user") +@RestController +public class UserController { + @Autowired + private UsersService usersService; + + @Operation(summary = "출석 체크 하기", description = "출석 체크 시, 돈을 지급하는 API 입니다.") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = UserResponseDTO.updateAttendance.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "사용자 정보를 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @PatchMapping("") + public ApiResponse updateAttendance(@RequestBody UserRequestDTO.checkAttendance request){ + UserResponseDTO.updateAttendance updateAttendance = usersService.updateAttendDate(request.getUserId()); + return ApiResponse.onSuccess(updateAttendance); + } +} diff --git a/src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java b/src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java new file mode 100644 index 0000000..d10422c --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java @@ -0,0 +1,17 @@ +package com.finut.finut_server.domain.user; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class UserRequestDTO { + @Getter + public static class checkAttendance { + @NotNull + Long userId; // 접속한 유저의 아이디 + } +} diff --git a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java index ff08bfc..483b84c 100644 --- a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java +++ b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java @@ -14,4 +14,13 @@ public static class loginUserDTO { String email; String accessToken; } + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class updateAttendance { + Long userId; + String message; + Boolean isAttend; + } } diff --git a/src/main/java/com/finut/finut_server/domain/user/Users.java b/src/main/java/com/finut/finut_server/domain/user/Users.java index 1686503..3314394 100644 --- a/src/main/java/com/finut/finut_server/domain/user/Users.java +++ b/src/main/java/com/finut/finut_server/domain/user/Users.java @@ -8,6 +8,9 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + @Getter @Setter @NoArgsConstructor @@ -36,6 +39,9 @@ public class Users extends BaseTimeEntity { @Column(nullable = false) private Long money = 100000L; + @Column(nullable = false) + private String attend = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + @Builder public Users(String name, String email, String picture, String refreshToken, Role role) { this.name = name; diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 5f2098a..7565d15 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -1,5 +1,8 @@ package com.finut.finut_server.service; +import com.finut.finut_server.apiPayload.code.status.ErrorStatus; +import com.finut.finut_server.apiPayload.exception.GeneralException; +import com.finut.finut_server.domain.user.UserResponseDTO; import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.domain.user.UsersRepository; import lombok.RequiredArgsConstructor; @@ -9,6 +12,8 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Optional; @@ -19,7 +24,6 @@ public class UsersService { @Autowired private UsersRepository usersRepository; - public void saveRefreshToken(String email, String refreshToken) { Optional optionalUser = usersRepository.findByEmail(email); if (optionalUser.isPresent()) { @@ -30,5 +34,31 @@ public void saveRefreshToken(String email, String refreshToken) { throw new UsernameNotFoundException("User not found"); } } + + public UserResponseDTO.updateAttendance updateAttendDate(Long userId){ + String msg = "이미 출석했습니다!"; + Boolean attend = true; + // userId로 attend 날짜 확인 + Users user = usersRepository.findById(userId) + .orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND)); + LocalDate today = LocalDate.now(); + String formattedDate = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + if(!user.getAttend().equals(formattedDate)){ + // 출석을 하지 않은 경우 + user.setAttend(formattedDate); + user.setMoney(user.getMoney() + 100000L); // 출석마다 금액이 바뀌는 등, 기획 수정 시, 코드도 수정 후 반영 예정 + usersRepository.save(user); + + msg = "출석했습니다!"; + attend = false; + } + UserResponseDTO.updateAttendance updateAttendance = UserResponseDTO.updateAttendance.builder() + .userId(userId) + .message(msg) + .isAttend(attend) + .build(); + + return updateAttendance; + } } From c4dcd25fee7ea45febef5f6b62c5688e8bcdaa31 Mon Sep 17 00:00:00 2001 From: yeojin Date: Wed, 28 Aug 2024 18:17:33 +0900 Subject: [PATCH 09/52] =?UTF-8?q?#27=20Update=20TodayNewsController:=20?= =?UTF-8?q?=EC=98=A4=EB=8A=98=EC=9D=98=20=EB=89=B4=EC=8A=A4=20=EA=B2=BD?= =?UTF-8?q?=EC=A0=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 + .../controller/TodayNewsController.java | 30 +++++++++ .../finut_server/domain/news/NewsItemDTO.java | 16 +++++ .../service/TodayNewsService.java | 62 +++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 src/main/java/com/finut/finut_server/controller/TodayNewsController.java create mode 100644 src/main/java/com/finut/finut_server/domain/news/NewsItemDTO.java create mode 100644 src/main/java/com/finut/finut_server/service/TodayNewsService.java diff --git a/build.gradle b/build.gradle index 258d16a..997953e 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,9 @@ dependencies { // mysql 설정 runtimeOnly 'com.mysql:mysql-connector-j' + + //RSS 툴 + implementation 'com.rometools:rome:1.15.0' } tasks.named('test') { diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java new file mode 100644 index 0000000..36ff385 --- /dev/null +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -0,0 +1,30 @@ +package com.finut.finut_server.controller; + +import com.finut.finut_server.domain.news.NewsItemDTO; +import com.finut.finut_server.service.TodayNewsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/news") +public class TodayNewsController { + + @Autowired + private TodayNewsService todayNewsService; + + @GetMapping("/economy") + public List newsEconomy() { + try { + return todayNewsService.economyFeed(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Fail to fetch RSS Economy", e); + } + } + +} diff --git a/src/main/java/com/finut/finut_server/domain/news/NewsItemDTO.java b/src/main/java/com/finut/finut_server/domain/news/NewsItemDTO.java new file mode 100644 index 0000000..f763a42 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/news/NewsItemDTO.java @@ -0,0 +1,16 @@ +package com.finut.finut_server.domain.news; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class NewsItemDTO { + private String title; + private String link; + private String description; + private int number; + private String ImageUrl; +} diff --git a/src/main/java/com/finut/finut_server/service/TodayNewsService.java b/src/main/java/com/finut/finut_server/service/TodayNewsService.java new file mode 100644 index 0000000..2eb1535 --- /dev/null +++ b/src/main/java/com/finut/finut_server/service/TodayNewsService.java @@ -0,0 +1,62 @@ +package com.finut.finut_server.service; + +import com.finut.finut_server.domain.news.NewsItemDTO; +import com.rometools.rome.feed.synd.SyndEntry; +import com.rometools.rome.feed.synd.SyndFeed; +import com.rometools.rome.io.XmlReader; +import org.springframework.stereotype.Service; +import com.rometools.rome.io.SyndFeedInput; + +import org.jdom2.Element; +import java.net.URL; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; + +@Service +public class TodayNewsService { + private static final String economy_URL = "https://www.mk.co.kr/rss/30100041/"; + + public List economyFeed() throws Exception { + URL feedSource = new URL(economy_URL); + SyndFeedInput input = new SyndFeedInput(); + SyndFeed feed = input.build(new XmlReader(feedSource)); + + return feed.getEntries().stream().map(this::convertToNewsItem).collect(Collectors.toList()); + } + + private NewsItemDTO convertToNewsItem(SyndEntry entry) { + NewsItemDTO news = new NewsItemDTO(); + + //URL 에서 number 추출 + String url = entry.getLink(); + String[] parts = url.split("/"); + news.setNumber(Integer.parseInt(parts[parts.length-1])); + + // 기본 정보 설정 + news.setTitle(entry.getTitle()); + news.setLink(url.replace("www.", "m.")); + news.setDescription(entry.getDescription().getValue()); + + + // 이미지 추출 + String imageUrl = null; + List foreignMarkup = entry.getForeignMarkup(); // 커스텀 태그 추출 + for (Element element : foreignMarkup) { + System.out.println(element); + if ("content".equals(element.getName()) && "image".equals(element.getAttributeValue("medium"))) { + imageUrl = element.getAttributeValue("url"); + break; + } + } + + news.setImageUrl(imageUrl); + + + return news; + } + +} From 95afe70f72e47f65635f6e8e978171b8f8c5519d Mon Sep 17 00:00:00 2001 From: yeojin Date: Wed, 28 Aug 2024 18:20:47 +0900 Subject: [PATCH 10/52] =?UTF-8?q?Update=20TodayNewsController:=20swagger?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80,=20=EB=89=B4?= =?UTF-8?q?=EC=8A=A4=20=EA=B0=9C=EC=88=98=20=EC=83=81=EC=9C=84=2010?= =?UTF-8?q?=EA=B0=9C=20=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TodayNewsController.java | 16 ++++++++++++++++ .../finut_server/service/TodayNewsService.java | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index 36ff385..16c3c91 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -1,7 +1,13 @@ package com.finut.finut_server.controller; +import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.news.NewsItemDTO; +import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.service.TodayNewsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,6 +23,16 @@ public class TodayNewsController { @Autowired private TodayNewsService todayNewsService; + @Operation(summary = "오늘의 뉴스", description = "오늘의 뉴스 중 경제 부분의 뉴스들을 보여줍니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @GetMapping("/economy") public List newsEconomy() { try { diff --git a/src/main/java/com/finut/finut_server/service/TodayNewsService.java b/src/main/java/com/finut/finut_server/service/TodayNewsService.java index 2eb1535..4ff3c27 100644 --- a/src/main/java/com/finut/finut_server/service/TodayNewsService.java +++ b/src/main/java/com/finut/finut_server/service/TodayNewsService.java @@ -25,7 +25,7 @@ public List economyFeed() throws Exception { SyndFeedInput input = new SyndFeedInput(); SyndFeed feed = input.build(new XmlReader(feedSource)); - return feed.getEntries().stream().map(this::convertToNewsItem).collect(Collectors.toList()); + return feed.getEntries().stream().map(this::convertToNewsItem).limit(10).collect(Collectors.toList()); } private NewsItemDTO convertToNewsItem(SyndEntry entry) { From a6baff6149b29c375414aa587b8167f3c003ce5b Mon Sep 17 00:00:00 2001 From: yeojin Date: Wed, 28 Aug 2024 18:30:18 +0900 Subject: [PATCH 11/52] =?UTF-8?q?#27=20Update=20TodayNews=20:=20=EB=B6=80?= =?UTF-8?q?=EB=8F=99=EC=82=B0,=20=EC=A6=9D=EA=B6=8C=20=EC=98=A4=EB=8A=98?= =?UTF-8?q?=EC=9D=98=20=EB=89=B4=EC=8A=A4=20=EC=A0=95=EB=B3=B4=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TodayNewsController.java | 44 ++++++++++++++++++- .../service/TodayNewsService.java | 18 +++++++- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index 16c3c91..af870ef 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -23,7 +23,7 @@ public class TodayNewsController { @Autowired private TodayNewsService todayNewsService; - @Operation(summary = "오늘의 뉴스", description = "오늘의 뉴스 중 경제 부분의 뉴스들을 보여줍니다") + @Operation(summary = "오늘의 뉴스 - 경제", description = "오늘의 뉴스 중 경제 부분의 뉴스들을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), @@ -36,7 +36,47 @@ public class TodayNewsController { @GetMapping("/economy") public List newsEconomy() { try { - return todayNewsService.economyFeed(); + return todayNewsService.getNews(1); // economy + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Fail to fetch RSS Economy", e); + } + } + + @Operation(summary = "오늘의 뉴스 - 부동산", description = "오늘의 뉴스 중 부동산 부분의 뉴스들을 보여줍니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/realestate") + public List newsRealEstate() { + try { + return todayNewsService.getNews(2); // real estate + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Fail to fetch RSS Economy", e); + } + } + + @Operation(summary = "오늘의 뉴스 - 증권", description = "오늘의 뉴스 중 증권 부분의 뉴스들을 보여줍니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/stock") + public List newsStock() { + try { + return todayNewsService.getNews(3); // stock } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Fail to fetch RSS Economy", e); diff --git a/src/main/java/com/finut/finut_server/service/TodayNewsService.java b/src/main/java/com/finut/finut_server/service/TodayNewsService.java index 4ff3c27..f64e385 100644 --- a/src/main/java/com/finut/finut_server/service/TodayNewsService.java +++ b/src/main/java/com/finut/finut_server/service/TodayNewsService.java @@ -19,9 +19,23 @@ @Service public class TodayNewsService { private static final String economy_URL = "https://www.mk.co.kr/rss/30100041/"; + private static final String real_estate_URL = "https://www.mk.co.kr/rss/50300009/"; + private static final String stock_URL = "https://www.mk.co.kr/rss/50200011/"; + + public List getNews(int type) throws Exception { + URL feedSource; + if (type == 1) + { + feedSource = new URL(economy_URL); + } + else if (type == 2) + { + feedSource = new URL(real_estate_URL); + } + else { + feedSource = new URL(stock_URL); + } - public List economyFeed() throws Exception { - URL feedSource = new URL(economy_URL); SyndFeedInput input = new SyndFeedInput(); SyndFeed feed = input.build(new XmlReader(feedSource)); From e7cfa0c048b441920ca84121a061e0a1050e98e4 Mon Sep 17 00:00:00 2001 From: yeojin Date: Sun, 29 Sep 2024 20:19:23 +0900 Subject: [PATCH 12/52] =?UTF-8?q?#29=20Update=20today=5Fnews:=201=EC=B0=A8?= =?UTF-8?q?=20=ED=81=AC=EB=A1=A4=EB=A7=81=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++- .../controller/TodayNewsController.java | 5 ++++ .../service/TodayNewsService.java | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 997953e..f1f02e9 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' // 스웨거 + implementation 'org.jsoup:jsoup:1.15.3' // 크롤링 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index af870ef..44dd28e 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -82,5 +82,10 @@ public List newsStock() { throw new RuntimeException("Fail to fetch RSS Economy", e); } } + @GetMapping("/get-content") + public String getContent() { + String url = "https://www.mk.co.kr/news/economy/11127965"; + return TodayNewsService.getMainContent(url); + } } diff --git a/src/main/java/com/finut/finut_server/service/TodayNewsService.java b/src/main/java/com/finut/finut_server/service/TodayNewsService.java index f64e385..8a8e68a 100644 --- a/src/main/java/com/finut/finut_server/service/TodayNewsService.java +++ b/src/main/java/com/finut/finut_server/service/TodayNewsService.java @@ -4,10 +4,15 @@ import com.rometools.rome.feed.synd.SyndEntry; import com.rometools.rome.feed.synd.SyndFeed; import com.rometools.rome.io.XmlReader; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.select.Elements; import org.springframework.stereotype.Service; import com.rometools.rome.io.SyndFeedInput; import org.jdom2.Element; + +import java.io.IOException; import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -73,4 +78,22 @@ private NewsItemDTO convertToNewsItem(SyndEntry entry) { return news; } + + public static String getMainContent(String url) { + try { + Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0").get(); + + Elements refIdElements = doc.select("p[refid]"); + + if (refIdElements != null) { + return refIdElements.toString(); + } else { + return "본문을 찾을 수 없습니다."; + } + + } catch (IOException e) { + e.printStackTrace(); + return "본문을 가져오는 도중 오류가 발생했습니다."; + } + } } From efe4ac1d05669242848eb88f94130e650d8a5b97 Mon Sep 17 00:00:00 2001 From: yeojin Date: Sun, 29 Sep 2024 20:35:19 +0900 Subject: [PATCH 13/52] =?UTF-8?q?#29=20Update=20today=20news:=20=EB=B3=B8?= =?UTF-8?q?=EB=AC=B8=20=ED=81=AC=EB=A1=A4=EB=A7=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TodayNewsController.java | 54 ++++++++++++++++--- .../service/TodayNewsService.java | 14 +++-- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index 44dd28e..c16e254 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -9,10 +9,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -82,9 +79,52 @@ public List newsStock() { throw new RuntimeException("Fail to fetch RSS Economy", e); } } - @GetMapping("/get-content") - public String getContent() { - String url = "https://www.mk.co.kr/news/economy/11127965"; + + @Operation(summary = "뉴스 본문 - 증권", description = "{number} 증권 뉴스의 본문을 보여줍니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/stock/{number}") + public String getStockContent(@PathVariable Long number) { + String url = "https://m.mk.co.kr/news/stock/" + number; + return TodayNewsService.getMainContent(url); + } + + @Operation(summary = "뉴스 본문 - 경제", description = "{number} 경제 뉴스의 본문을 보여줍니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/economy/{number}") + public String getEconomyContent(@PathVariable Long number) { + String url = "https://m.mk.co.kr/news/economy/" + number; + return TodayNewsService.getMainContent(url); + } + + @Operation(summary = "뉴스 본문 - 부동산", description = "{number} 부동산 뉴스의 본문을 보여줍니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/realestate/{number}") + public String getContent(@PathVariable Long number) { + String url = "https://m.mk.co.kr/news/realestate/" + number; return TodayNewsService.getMainContent(url); } diff --git a/src/main/java/com/finut/finut_server/service/TodayNewsService.java b/src/main/java/com/finut/finut_server/service/TodayNewsService.java index 8a8e68a..b214d4d 100644 --- a/src/main/java/com/finut/finut_server/service/TodayNewsService.java +++ b/src/main/java/com/finut/finut_server/service/TodayNewsService.java @@ -83,12 +83,18 @@ public static String getMainContent(String url) { try { Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0").get(); - Elements refIdElements = doc.select("p[refid]"); + // 본문을 감싸고 있는 요소 선택 (div.news_cnt_detail_wrap) + org.jsoup.nodes.Element content = doc.selectFirst("div.news_cnt_detail_wrap[itemprop=articleBody]"); - if (refIdElements != null) { - return refIdElements.toString(); + if (content != null) { + // 이미지, 광고, 비어있는 태그 등을 제거 + content.select("img, iframe, figure, figcaption, .ad_boxm1, .thumb_area, .mid_title").remove(); + + // 텍스트만 추출 + String text = content.text(); + return text.toString(); } else { - return "본문을 찾을 수 없습니다."; + return("본문을 찾을 수 없습니다."); } } catch (IOException e) { From 86fa57599c66dec73671698c8c3acf4e38900c17 Mon Sep 17 00:00:00 2001 From: yeojin Date: Mon, 28 Oct 2024 23:24:25 +0900 Subject: [PATCH 14/52] =?UTF-8?q?Update=20TodayNewsController:=20=EB=B3=B8?= =?UTF-8?q?=EB=AC=B8=20return=20=ED=98=95=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TodayNewsController.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index c16e254..e4bbffe 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -11,7 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; @RestController @RequestMapping("/news") @@ -91,9 +93,14 @@ public List newsStock() { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/stock/{number}") - public String getStockContent(@PathVariable Long number) { + public Map getStockContent(@PathVariable Long number) { String url = "https://m.mk.co.kr/news/stock/" + number; - return TodayNewsService.getMainContent(url); + String content = TodayNewsService.getMainContent(url); + + Map response = new HashMap<>(); + response.put("content", content); + + return response; } @Operation(summary = "뉴스 본문 - 경제", description = "{number} 경제 뉴스의 본문을 보여줍니다") @@ -107,9 +114,14 @@ public String getStockContent(@PathVariable Long number) { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/economy/{number}") - public String getEconomyContent(@PathVariable Long number) { + public Map getEconomyContent(@PathVariable Long number) { String url = "https://m.mk.co.kr/news/economy/" + number; - return TodayNewsService.getMainContent(url); + String content = TodayNewsService.getMainContent(url); + + Map response = new HashMap<>(); + response.put("content", content); + + return response; } @Operation(summary = "뉴스 본문 - 부동산", description = "{number} 부동산 뉴스의 본문을 보여줍니다") @@ -123,9 +135,14 @@ public String getEconomyContent(@PathVariable Long number) { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/realestate/{number}") - public String getContent(@PathVariable Long number) { + public Map getContent(@PathVariable Long number) { String url = "https://m.mk.co.kr/news/realestate/" + number; - return TodayNewsService.getMainContent(url); + String content = TodayNewsService.getMainContent(url); + + Map response = new HashMap<>(); + response.put("content", content); + + return response; } } From ad24f7e520dfbc1f05a2e7a46c6dafcee671a296 Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 02:23:45 +0900 Subject: [PATCH 15/52] =?UTF-8?q?update=20Difficulty:=20difficulty=20domai?= =?UTF-8?q?n=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/difficulty/Difficulty.java | 19 +++++++++++++++++++ .../difficulty/DifficultyRepository.java | 7 +++++++ .../domain/difficulty/DifficultyType.java | 7 +++++++ 3 files changed, 33 insertions(+) create mode 100644 src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java create mode 100644 src/main/java/com/finut/finut_server/domain/difficulty/DifficultyRepository.java create mode 100644 src/main/java/com/finut/finut_server/domain/difficulty/DifficultyType.java diff --git a/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java new file mode 100644 index 0000000..60f4ad1 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java @@ -0,0 +1,19 @@ +package com.finut.finut_server.domain.difficulty; + +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Table(name = "Difficulty") +public class Difficulty { + + @Id + @Enumerated(EnumType.STRING) + private DifficultyType difficulty; + + @Column + private int diffQuizCnt; + +} diff --git a/src/main/java/com/finut/finut_server/domain/difficulty/DifficultyRepository.java b/src/main/java/com/finut/finut_server/domain/difficulty/DifficultyRepository.java new file mode 100644 index 0000000..de53b06 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/difficulty/DifficultyRepository.java @@ -0,0 +1,7 @@ +package com.finut.finut_server.domain.difficulty; + +import com.finut.finut_server.domain.product.Product; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DifficultyRepository extends JpaRepository { +} diff --git a/src/main/java/com/finut/finut_server/domain/difficulty/DifficultyType.java b/src/main/java/com/finut/finut_server/domain/difficulty/DifficultyType.java new file mode 100644 index 0000000..aa3b590 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/difficulty/DifficultyType.java @@ -0,0 +1,7 @@ +package com.finut.finut_server.domain.difficulty; + +public enum DifficultyType { + HI, + MI, + LO +} From db7f7f812bbab91612588c1a17d6896d9368567b Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 02:25:44 +0900 Subject: [PATCH 16/52] =?UTF-8?q?Update=20Difficulty:=20difficuly=20domain?= =?UTF-8?q?=20nullable=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/domain/difficulty/Difficulty.java | 3 +-- .../java/com/finut/finut_server/domain/quiz/Quiz.java | 10 ---------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java index 60f4ad1..c609bbe 100644 --- a/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java +++ b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java @@ -13,7 +13,6 @@ public class Difficulty { @Enumerated(EnumType.STRING) private DifficultyType difficulty; - @Column + @Column(nullable = false) private int diffQuizCnt; - } diff --git a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java index 3e097a6..e775919 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java @@ -20,16 +20,6 @@ public class Quiz extends BaseTimeEntity { @Column(nullable = false) private String question; // 퀴즈 내용 - @Lob - @Column(nullable = false) - private String option1; - - @Lob - private String option2; - - @Lob - private String option3; - @Column(nullable = false) @Lob private String answer; From 73641dd393eb4a0817a0d08c54219d5455e54c17 Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 02:47:10 +0900 Subject: [PATCH 17/52] =?UTF-8?q?Update=20domain:=20Quiz,=20QuizDone=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/difficulty/Difficulty.java | 4 +++ .../finut_server/domain/quiz/AnswerType.java | 6 ++++ .../finut/finut_server/domain/quiz/Quiz.java | 26 ++++++++--------- .../domain/quiz/QuizRepository.java | 12 ++++---- .../domain/quizDone/QuizDone.java | 28 +++++++++++++++++++ .../domain/quizDone/QuizDoneRepository.java | 6 ++++ .../finut/finut_server/domain/user/Users.java | 13 +++++++++ 7 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/finut/finut_server/domain/quiz/AnswerType.java create mode 100644 src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java create mode 100644 src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java diff --git a/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java index c609bbe..6f293b0 100644 --- a/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java +++ b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java @@ -1,5 +1,6 @@ package com.finut.finut_server.domain.difficulty; +import com.finut.finut_server.domain.user.Users; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.persistence.*; import lombok.*; @@ -15,4 +16,7 @@ public class Difficulty { @Column(nullable = false) private int diffQuizCnt; + + @OneToOne(mappedBy = "difficulty") + private Users user; } diff --git a/src/main/java/com/finut/finut_server/domain/quiz/AnswerType.java b/src/main/java/com/finut/finut_server/domain/quiz/AnswerType.java new file mode 100644 index 0000000..d95467a --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quiz/AnswerType.java @@ -0,0 +1,6 @@ +package com.finut.finut_server.domain.quiz; + +public enum AnswerType { + TRUE, + FALSE +} diff --git a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java index e775919..9526193 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java @@ -2,9 +2,13 @@ import com.finut.finut_server.domain.BaseTimeEntity; +import com.finut.finut_server.domain.difficulty.DifficultyType; +import com.finut.finut_server.domain.quizDone.QuizDone; import jakarta.persistence.*; import lombok.*; +import java.util.Set; + @Entity @Builder @Getter @@ -18,24 +22,20 @@ public class Quiz extends BaseTimeEntity { private Long id; @Column(nullable = false) - private String question; // 퀴즈 내용 + @Enumerated(EnumType.STRING) + private DifficultyType difficulty; // 난이도 @Column(nullable = false) @Lob - private String answer; - - @Column(nullable = false, columnDefinition = "MEDIUMTEXT") - private String description; // 정답 설명 - - @Enumerated(EnumType.STRING) - private QuizType quizType; // 퀴즈 타입: TF or MUL + private String question; // 퀴즈 내용 @Column(nullable = false) - private int displayed; // 출제된지 여부 판단 (1: 출제된 적 있음, 0: 출제된 적 없음) + @Enumerated(EnumType.STRING) + private AnswerType answer; - @Column(nullable = false) - private int correctMoney; // 맞춘 경우 얻는 돈 + @Column(nullable = false, columnDefinition = "MEDIUMTEXT") + private String description; // 정답 설명 - @Column(nullable = false) - private int wrongMoney; // 틀린 경우 얻는 돈 + @OneToMany(mappedBy = "quiz", cascade = CascadeType.ALL, orphanRemoval = true) + private Set quizDoneList; } diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java index eabe287..136d499 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java @@ -11,11 +11,11 @@ public interface QuizRepository extends JpaRepository { - @Query("SELECT e FROM Quiz e WHERE DATE(e.createdDate) = :date") - Quiz findByDate(@Param("date") LocalDate date); +// @Query("SELECT e FROM Quiz e WHERE DATE(e.createdDate) = :date") +// Quiz findByDate(@Param("date") LocalDate date); - @Modifying - @Transactional - @Query("UPDATE Users u SET u.money = u.money + :moneyAmount WHERE u.id = :userId") - void updateMoney(Long userId, int moneyAmount); +// @Modifying +// @Transactional +// @Query("UPDATE Users u SET u.money = u.money + :moneyAmount WHERE u.id = :userId") +// void updateMoney(Long userId, int moneyAmount); } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java new file mode 100644 index 0000000..be5c7a8 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -0,0 +1,28 @@ +package com.finut.finut_server.domain.quizDone; + +import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.user.Users; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import org.springframework.web.service.annotation.GetExchange; + +@Entity +@Getter +@Setter +public class QuizDone { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "quiz_id", nullable = false) + private Quiz quiz; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private Users userId; + + @Column + private Boolean isCorrect; +} diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java new file mode 100644 index 0000000..a16bd92 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java @@ -0,0 +1,6 @@ +package com.finut.finut_server.domain.quizDone; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface QuizDoneRepository extends JpaRepository { +} diff --git a/src/main/java/com/finut/finut_server/domain/user/Users.java b/src/main/java/com/finut/finut_server/domain/user/Users.java index 3314394..49a7a09 100644 --- a/src/main/java/com/finut/finut_server/domain/user/Users.java +++ b/src/main/java/com/finut/finut_server/domain/user/Users.java @@ -2,6 +2,8 @@ import com.finut.finut_server.domain.BaseTimeEntity; +import com.finut.finut_server.domain.difficulty.Difficulty; +import com.finut.finut_server.domain.quizDone.QuizDone; import jakarta.persistence.*; import lombok.Builder; import lombok.Getter; @@ -10,6 +12,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.Set; @Getter @Setter @@ -42,6 +45,16 @@ public class Users extends BaseTimeEntity { @Column(nullable = false) private String attend = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + + @OneToOne + @JoinColumn(name = "difficulty") + private Difficulty difficulty; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + private Set quizDoneList; + + @Builder public Users(String name, String email, String picture, String refreshToken, Role role) { this.name = name; From c7c67a9cf9bd5486285b2fb8f88ea450bff36294 Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 02:57:41 +0900 Subject: [PATCH 18/52] =?UTF-8?q?Remove=20QuizeDTO:=20=EC=83=88=EB=A1=AD?= =?UTF-8?q?=EA=B2=8C=20=EB=B0=94=EB=80=90=20=EA=B8=B0=ED=9A=8D=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=EA=B8=B0=EC=A1=B4=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HomeController.java | 4 -- .../controller/InterestRateController.java | 6 -- .../controller/QuizController.java | 2 - .../controller/TodayNewsController.java | 2 - .../finut_server/converter/QuizConverter.java | 3 - .../domain/quiz/QuizRepository.java | 7 --- .../domain/quiz/QuizRequestDTO.java | 25 -------- .../domain/quiz/QuizResponseDTO.java | 28 --------- .../finut_server/domain/quiz/QuizType.java | 6 -- .../finut_server/service/QuizService.java | 59 ++++++++----------- 10 files changed, 26 insertions(+), 116 deletions(-) delete mode 100644 src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java delete mode 100644 src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java delete mode 100644 src/main/java/com/finut/finut_server/domain/quiz/QuizType.java diff --git a/src/main/java/com/finut/finut_server/controller/HomeController.java b/src/main/java/com/finut/finut_server/controller/HomeController.java index b381de3..de96968 100644 --- a/src/main/java/com/finut/finut_server/controller/HomeController.java +++ b/src/main/java/com/finut/finut_server/controller/HomeController.java @@ -3,9 +3,6 @@ import com.finut.finut_server.apiPayload.ApiResponse; import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.config.auth.dto.SessionUser; -import com.finut.finut_server.converter.QuizConverter; -import com.finut.finut_server.domain.quiz.Quiz; -import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.domain.user.UserResponseDTO; import com.finut.finut_server.service.UsersService; import io.swagger.v3.oas.annotations.Operation; @@ -21,7 +18,6 @@ import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/com/finut/finut_server/controller/InterestRateController.java b/src/main/java/com/finut/finut_server/controller/InterestRateController.java index 85d550f..4fb2c6b 100644 --- a/src/main/java/com/finut/finut_server/controller/InterestRateController.java +++ b/src/main/java/com/finut/finut_server/controller/InterestRateController.java @@ -1,21 +1,15 @@ package com.finut.finut_server.controller; import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import com.finut.finut_server.apiPayload.ApiResponse; import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; -import com.finut.finut_server.domain.product.Product; -import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.service.InterestRateService; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @Tag(name = "InterestRate Controller", description = "금리 데이터 api") diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 9855092..6c18474 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -4,8 +4,6 @@ import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.converter.QuizConverter; import com.finut.finut_server.domain.quiz.Quiz; -import com.finut.finut_server.domain.quiz.QuizRequestDTO; -import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.service.QuizService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index af870ef..6c1c893 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -2,7 +2,6 @@ import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.news.NewsItemDTO; -import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.service.TodayNewsService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -11,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; diff --git a/src/main/java/com/finut/finut_server/converter/QuizConverter.java b/src/main/java/com/finut/finut_server/converter/QuizConverter.java index 1dbdcf6..8afae97 100644 --- a/src/main/java/com/finut/finut_server/converter/QuizConverter.java +++ b/src/main/java/com/finut/finut_server/converter/QuizConverter.java @@ -1,9 +1,6 @@ package com.finut.finut_server.converter; import com.finut.finut_server.domain.quiz.Quiz; -import com.finut.finut_server.domain.quiz.QuizRequestDTO; -import com.finut.finut_server.domain.quiz.QuizResponseDTO; -import org.springframework.security.core.parameters.P; public class QuizConverter { diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java index 136d499..6dfa18c 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java @@ -11,11 +11,4 @@ public interface QuizRepository extends JpaRepository { -// @Query("SELECT e FROM Quiz e WHERE DATE(e.createdDate) = :date") -// Quiz findByDate(@Param("date") LocalDate date); - -// @Modifying -// @Transactional -// @Query("UPDATE Users u SET u.money = u.money + :moneyAmount WHERE u.id = :userId") -// void updateMoney(Long userId, int moneyAmount); } diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java deleted file mode 100644 index b8f5d30..0000000 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizRequestDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.finut.finut_server.domain.quiz; - -import jakarta.validation.constraints.NotNull; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -public class QuizRequestDTO { - - @Getter - public static class updateMoney{ - @NotNull - Long userId; // 접속한 유저의 아이디 - @NotNull - boolean isCorrect; // 정답 여부 - 정답이면 true, 오답이면 false - @NotNull - int correctMoney; // 맞춘 경우 받는 돈 - @NotNull - int wrongMoney; // 틀린 경우 받는 돈 - } - -} diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java deleted file mode 100644 index 94af1c2..0000000 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.finut.finut_server.domain.quiz; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -public class QuizResponseDTO { - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class getQuizDto{ - Long userId; // 접속한 유저의 아이디 - Quiz quiz; - } - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class updateMoneyDto{ - Long userId; // 접속한 유저의 아이디 - int moneyAmount; // 적립된 금액 - } -} diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizType.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizType.java deleted file mode 100644 index 3a5a66a..0000000 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.finut.finut_server.domain.quiz; - -public enum QuizType { - TF, // OX - MUL // 삼지선다 -} diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index b1bf5d9..d25b175 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -2,20 +2,13 @@ import com.finut.finut_server.apiPayload.code.status.ErrorStatus; import com.finut.finut_server.apiPayload.exception.GeneralException; -import com.finut.finut_server.controller.QuizController; -import com.finut.finut_server.converter.QuizConverter; import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.quiz.QuizRepository; -import com.finut.finut_server.domain.quiz.QuizRequestDTO; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Optional; import java.util.Random; @Service @@ -25,31 +18,31 @@ public class QuizService { @Autowired private QuizRepository quizRepository; - @Transactional - public Quiz getQuiz(){ - // displayed == 0 이면 조회 가능 - Quiz quiz; - while(true){ - Random random = new Random(); - Long randomNumber = random.nextLong(260) + 1; // 1부터 260까지의 숫자를 랜덤하게 뽑음 - quiz = quizRepository.findById(randomNumber) - .orElseThrow(() -> new GeneralException(ErrorStatus.INVALID_NUMBER)); - if(quiz.getDisplayed() == 0) { - quiz.setDisplayed(1); - quiz = quizRepository.save(quiz); - break; - } - } - return quiz; - } +// @Transactional +// public Quiz getQuiz(){ +// // displayed == 0 이면 조회 가능 +// Quiz quiz; +// while(true){ +// Random random = new Random(); +// Long randomNumber = random.nextLong(260) + 1; // 1부터 260까지의 숫자를 랜덤하게 뽑음 +// quiz = quizRepository.findById(randomNumber) +// .orElseThrow(() -> new GeneralException(ErrorStatus.INVALID_NUMBER)); +// if(quiz.getDisplayed() == 0) { +// quiz.setDisplayed(1); +// quiz = quizRepository.save(quiz); +// break; +// } +// } +// return quiz; +// } - @Transactional - public int updateMoney(QuizRequestDTO.updateMoney request){ - int moneyAmount = 0; - if(request.isCorrect()) moneyAmount = request.getCorrectMoney(); - else moneyAmount = request.getWrongMoney(); - - quizRepository.updateMoney(request.getUserId(), moneyAmount); - return moneyAmount; - } +// @Transactional +// public int updateMoney(QuizRequestDTO.updateMoney request){ +// int moneyAmount = 0; +// if(request.isCorrect()) moneyAmount = request.getCorrectMoney(); +// else moneyAmount = request.getWrongMoney(); +// +// quizRepository.updateMoney(request.getUserId(), moneyAmount); +// return moneyAmount; +// } } From 8f4fb2a4c1b6dd44c86b2ec9149da0f4d86e9676 Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 03:09:25 +0900 Subject: [PATCH 19/52] =?UTF-8?q?Update=20QuizDone:=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=EA=B0=92=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/controller/QuizController.java | 15 --------------- .../finut_server/domain/quizDone/QuizDone.java | 4 ++-- .../finut/finut_server/service/QuizService.java | 9 --------- 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 6c18474..7281334 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -37,19 +37,4 @@ public ApiResponse getQuiz(@RequestParam(name="userI return ApiResponse.onSuccess(QuizConverter.toGetQuizDto(userId, quiz)); } - @Operation(summary = "퀴즈 정답 판독 후 돈 적립", description = "사용자가 입력한 답이 정답인지 판독한 후, 정답 여부에 따라 돈을 적립합니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.updateMoneyDto.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "정답 여부를 전달 받지 못했습니다.", - content = @Content), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", - content = @Content(mediaType = "application/json", - schema = @Schema(implementation = ErrorReasonDTO.class))) - }) - @PatchMapping("/money") - public ApiResponse updateMoney(@RequestBody @Valid QuizRequestDTO.updateMoney request){ - int moneyAmount = quizService.updateMoney(request); - return ApiResponse.onSuccess(QuizConverter.toUpdateMoneyDto(request.getUserId(), moneyAmount)); - } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java index be5c7a8..52f9037 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -23,6 +23,6 @@ public class QuizDone { @JoinColumn(name = "user_id", nullable = false) private Users userId; - @Column - private Boolean isCorrect; + @Column(nullable = false) + private Boolean isCorrect = false; } diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index d25b175..6a18df4 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -36,13 +36,4 @@ public class QuizService { // return quiz; // } -// @Transactional -// public int updateMoney(QuizRequestDTO.updateMoney request){ -// int moneyAmount = 0; -// if(request.isCorrect()) moneyAmount = request.getCorrectMoney(); -// else moneyAmount = request.getWrongMoney(); -// -// quizRepository.updateMoney(request.getUserId(), moneyAmount); -// return moneyAmount; -// } } From 12c641dde6c123b24ea382366b197665612cf8d9 Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 29 Oct 2024 04:23:26 +0900 Subject: [PATCH 20/52] =?UTF-8?q?#25=20Update=20User=20:=20=EB=88=84?= =?UTF-8?q?=EC=A0=81=205=EB=B2=88=20=EC=B6=9C=EC=84=9D=ED=95=98=EB=8A=94?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0,=20=EC=9B=94=EA=B8=89=20=EC=A7=80?= =?UTF-8?q?=EA=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- level.sql | 7 ++ .../apiPayload/code/status/ErrorStatus.java | 5 +- .../controller/UserController.java | 2 +- .../finut_server/domain/attend/Attend.java | 36 ++++++++ .../domain/attend/AttendRepository.java | 16 ++++ .../finut_server/domain/level/Level.java | 28 ++++++ .../finut_server/domain/level/LevelName.java | 11 +++ .../domain/level/LevelRepository.java | 10 ++ .../domain/user/UserResponseDTO.java | 1 - .../finut/finut_server/domain/user/Users.java | 34 ++++++- .../finut_server/service/UsersService.java | 91 ++++++++++++++++--- 11 files changed, 222 insertions(+), 19 deletions(-) create mode 100644 level.sql create mode 100644 src/main/java/com/finut/finut_server/domain/attend/Attend.java create mode 100644 src/main/java/com/finut/finut_server/domain/attend/AttendRepository.java create mode 100644 src/main/java/com/finut/finut_server/domain/level/Level.java create mode 100644 src/main/java/com/finut/finut_server/domain/level/LevelName.java create mode 100644 src/main/java/com/finut/finut_server/domain/level/LevelRepository.java diff --git a/level.sql b/level.sql new file mode 100644 index 0000000..24b11cf --- /dev/null +++ b/level.sql @@ -0,0 +1,7 @@ +insert into finut.level(id, level, level_quiz_cnt, salary) values (1, 0, 5, 400000); +insert into finut.level(id, level, level_quiz_cnt, salary) values (2, 1, 5, 1000000); +insert into finut.level(id, level, level_quiz_cnt, salary) values (3, 2, 5, 2000000); +insert into finut.level(id, level, level_quiz_cnt, salary) values (4, 3, 5, 4000000); +insert into finut.level(id, level, level_quiz_cnt, salary) values (5, 4, 5, 6000000); +insert into finut.level(id, level, level_quiz_cnt, salary) values (6, 5, 5, 8000000); +insert into finut.level(id, level, level_quiz_cnt, salary) values (7, 6, 5, 10000000); \ No newline at end of file diff --git a/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java index 8c1ed55..0c087f5 100644 --- a/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/finut/finut_server/apiPayload/code/status/ErrorStatus.java @@ -25,7 +25,10 @@ public enum ErrorStatus implements BaseErrorCode { // 퀴즈 관련 에러 INVALID_NUMBER(HttpStatus.BAD_REQUEST, "QUIZ400", "유효하지 않은 값입니다."), - NULL_DATA(HttpStatus.BAD_REQUEST, "QUIZ401", "데이터가 없습니다."); + NULL_DATA(HttpStatus.BAD_REQUEST, "QUIZ401", "데이터가 없습니다."), + + // 출석 관련 에러 + NO_DATA_FOUND(HttpStatus.BAD_REQUEST, "ATTEND400", "데이터가 없습니다"); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/finut/finut_server/controller/UserController.java b/src/main/java/com/finut/finut_server/controller/UserController.java index 947a3f2..8d2a9df 100644 --- a/src/main/java/com/finut/finut_server/controller/UserController.java +++ b/src/main/java/com/finut/finut_server/controller/UserController.java @@ -20,7 +20,7 @@ public class UserController { @Autowired private UsersService usersService; - @Operation(summary = "출석 체크 하기", description = "출석 체크 시, 돈을 지급하는 API 입니다.") + @Operation(summary = "월급 받기", description = "출석체크 수가 5의 배수면 월급을 받는 API 입니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = UserResponseDTO.updateAttendance.class))), diff --git a/src/main/java/com/finut/finut_server/domain/attend/Attend.java b/src/main/java/com/finut/finut_server/domain/attend/Attend.java new file mode 100644 index 0000000..6e3eb2d --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/attend/Attend.java @@ -0,0 +1,36 @@ +package com.finut.finut_server.domain.attend; + +import com.finut.finut_server.domain.BaseTimeEntity; +import com.finut.finut_server.domain.purchases.Purchases; +import com.finut.finut_server.domain.user.Users; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@IdClass(Attend.AttendId.class) +public class Attend extends BaseTimeEntity { + @Id + @ManyToOne + @JoinColumn(name = "userId", referencedColumnName = "id") + private Users user; + + @Id + @Column(nullable = false) + private String attendDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + public static class AttendId implements Serializable { + private Long user; + private String attendDate; + } +} diff --git a/src/main/java/com/finut/finut_server/domain/attend/AttendRepository.java b/src/main/java/com/finut/finut_server/domain/attend/AttendRepository.java new file mode 100644 index 0000000..059bbad --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/attend/AttendRepository.java @@ -0,0 +1,16 @@ +package com.finut.finut_server.domain.attend; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +public interface AttendRepository extends JpaRepository { + Optional findByUserIdAndAttendDate(Long userId, String attendDate); + + @Query("SELECT attendDate FROM Attend WHERE user = :userId AND attendDate <= :today ORDER BY attendDate DESC LIMIT 5") + List findTop5ByUserIdAndDateBeforeOrderByDateDesc(Long userId, LocalDate today); +} + diff --git a/src/main/java/com/finut/finut_server/domain/level/Level.java b/src/main/java/com/finut/finut_server/domain/level/Level.java new file mode 100644 index 0000000..b6c73be --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/level/Level.java @@ -0,0 +1,28 @@ +package com.finut.finut_server.domain.level; + +import com.finut.finut_server.domain.BaseTimeEntity; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +public class Level extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private LevelName level; // 직급 + + @Column(nullable = false) + private int salary; // 월급 액수 + + @Column(nullable = false) + private int levelQuizCnt = 5; // 승진을 위한 퀴즈 수 +} diff --git a/src/main/java/com/finut/finut_server/domain/level/LevelName.java b/src/main/java/com/finut/finut_server/domain/level/LevelName.java new file mode 100644 index 0000000..0ceacbb --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/level/LevelName.java @@ -0,0 +1,11 @@ +package com.finut.finut_server.domain.level; + +public enum LevelName { + PARTTIMEJOB, + INTERN, + STAFF, + ASSOCIATEMANAGER, + MANAGER, + SENIORMANAGER, + DIRECTOR +} diff --git a/src/main/java/com/finut/finut_server/domain/level/LevelRepository.java b/src/main/java/com/finut/finut_server/domain/level/LevelRepository.java new file mode 100644 index 0000000..e8671ca --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/level/LevelRepository.java @@ -0,0 +1,10 @@ +package com.finut.finut_server.domain.level; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface LevelRepository extends JpaRepository { + + Level findById(Long id); +} diff --git a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java index 483b84c..3f93560 100644 --- a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java +++ b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java @@ -21,6 +21,5 @@ public static class loginUserDTO { public static class updateAttendance { Long userId; String message; - Boolean isAttend; } } diff --git a/src/main/java/com/finut/finut_server/domain/user/Users.java b/src/main/java/com/finut/finut_server/domain/user/Users.java index 3314394..6f9edce 100644 --- a/src/main/java/com/finut/finut_server/domain/user/Users.java +++ b/src/main/java/com/finut/finut_server/domain/user/Users.java @@ -2,17 +2,17 @@ import com.finut.finut_server.domain.BaseTimeEntity; +import com.finut.finut_server.domain.level.Level; +import com.finut.finut_server.domain.level.LevelName; import jakarta.persistence.*; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @Getter @Setter +@AllArgsConstructor @NoArgsConstructor @Entity public class Users extends BaseTimeEntity { @@ -39,8 +39,24 @@ public class Users extends BaseTimeEntity { @Column(nullable = false) private Long money = 100000L; + @OneToOne + @JoinColumn(name = "levelId", referencedColumnName = "id") + private Level level; + + @Column(nullable = false) + private int attendCount = 0; + @Column(nullable = false) - private String attend = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + private int XP = 0; + + @Column(nullable = false) + private boolean todaySalary = false; + + @Column(nullable = false) + private int diffQuizCount = 0; + + @Column(nullable = false) + private int levelQuizCount = 0; @Builder public Users(String name, String email, String picture, String refreshToken, Role role) { @@ -67,4 +83,12 @@ public Users setRefreshToken(String refreshToken) public String getRoleKey() { return this.role.getKey(); } + + @PrePersist + public void prePersist() { + if (this.level == null) { + this.level = new Level(); // 또는 LevelRepository를 사용해 ID가 1인 Level을 설정 + this.level.setId(1L); // 기본값으로 ID가 1인 Level 설정 + } + } } diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 7565d15..539f9a2 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -2,6 +2,10 @@ import com.finut.finut_server.apiPayload.code.status.ErrorStatus; import com.finut.finut_server.apiPayload.exception.GeneralException; +import com.finut.finut_server.domain.attend.Attend; +import com.finut.finut_server.domain.attend.AttendRepository; +import com.finut.finut_server.domain.level.Level; +import com.finut.finut_server.domain.level.LevelRepository; import com.finut.finut_server.domain.user.UserResponseDTO; import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.domain.user.UsersRepository; @@ -15,6 +19,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.List; import java.util.Optional; @Service @@ -24,6 +29,12 @@ public class UsersService { @Autowired private UsersRepository usersRepository; + @Autowired + private AttendRepository attendRepository; + + @Autowired + private LevelRepository levelRepository; + public void saveRefreshToken(String email, String refreshToken) { Optional optionalUser = usersRepository.findByEmail(email); if (optionalUser.isPresent()) { @@ -36,29 +47,87 @@ public void saveRefreshToken(String email, String refreshToken) { } public UserResponseDTO.updateAttendance updateAttendDate(Long userId){ - String msg = "이미 출석했습니다!"; - Boolean attend = true; - // userId로 attend 날짜 확인 + String msg = "출석했습니다!"; Users user = usersRepository.findById(userId) .orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND)); LocalDate today = LocalDate.now(); String formattedDate = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - if(!user.getAttend().equals(formattedDate)){ - // 출석을 하지 않은 경우 - user.setAttend(formattedDate); - user.setMoney(user.getMoney() + 100000L); // 출석마다 금액이 바뀌는 등, 기획 수정 시, 코드도 수정 후 반영 예정 - usersRepository.save(user); - msg = "출석했습니다!"; - attend = false; + Attend attend = attendRepository.findByUserIdAndAttendDate(userId, formattedDate).orElse(null); + + if(attend == null){ + // 오늘 처음 출석하는 경우 + attend = new Attend(); + attend.setUser(user); + attend.setAttendDate(formattedDate); + attendRepository.save(attend); + + user.setAttendCount(user.getAttendCount() + 1); + +// // 만약 연속 출석인 경우, XP 올리기 +// if(hasFiveConsecutiveDays(userId)){ +// user.setXP(user.getXP() + 5); +// } + +// // XP가 100이면 승진하기 +// if(user.getXP() == 100){ +// user.setLevel(user.getLevel()); +// } } + else{ + // 처음 출석하는 경우가 아니라면 + if(user.isTodaySalary()){ + // 오늘 이미 월급을 받았다면 + msg = "오늘은 이미 월급을 받았습니다!"; + } + else if(user.getAttendCount() == 5){ + // attendCount가 5가 되었다면 + user.setTodaySalary(true); + user.setAttendCount(0); + Level level = levelRepository.findById(user.getLevel().getId()); + user.setMoney(user.getMoney() + level.getSalary()); + msg = "월급을 받았습니다!"; + } + else { + user.setAttendCount(user.getAttendCount() + 1); + } + } + usersRepository.save(user); + UserResponseDTO.updateAttendance updateAttendance = UserResponseDTO.updateAttendance.builder() .userId(userId) .message(msg) - .isAttend(attend) .build(); return updateAttendance; } + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + public boolean hasFiveConsecutiveDays(Long userId) { + LocalDate today = LocalDate.now(); + + // 오늘 날짜 포함하여 5일치 데이터 가져오기 + List dateStrings = attendRepository.findTop5ByUserIdAndDateBeforeOrderByDateDesc(userId, today); + + // 데이터가 부족한 경우 연속 5일이 아니므로 false + if (dateStrings.size() < 5) { + return false; + } + + // 날짜를 LocalDate 형식으로 변환하여 오름차순 정렬 + List dates = dateStrings.stream() + .map(date -> LocalDate.parse(date, FORMATTER)) + .sorted() + .toList(); + + // 연속적인 5일인지 확인 + for (int i = 1; i < dates.size(); i++) { + if (!dates.get(i).minusDays(1).equals(dates.get(i - 1))) { + return false; // 연속되지 않은 날짜가 있으면 false 반환 + } + } + return true; + } } From ae2f7ed5b39b50c35a19efe88a92d6c92cb0b4b8 Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 04:25:26 +0900 Subject: [PATCH 21/52] =?UTF-8?q?Update=20quiz:=20quiz=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuizController.java | 16 +++-- .../domain/quiz/QuizRepository.java | 2 + .../domain/quiz/QuizResponseDTO.java | 22 ++++++ .../domain/quizDone/QuizDone.java | 14 +--- .../domain/quizDone/QuizDoneId.java | 38 +++++++++++ .../domain/quizDone/QuizDoneRepository.java | 9 ++- .../finut_server/service/QuizService.java | 67 +++++++++++++------ 7 files changed, 131 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java create mode 100644 src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 7281334..3a06130 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -2,29 +2,31 @@ import com.finut.finut_server.apiPayload.ApiResponse; import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; -import com.finut.finut_server.converter.QuizConverter; import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.service.QuizService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Optional; + @RestController @RequestMapping("/quiz") @Tag(name = "Quiz Controller", description = "퀴즈 관련 api") public class QuizController { @Autowired private QuizService quizService; + private QuizResponseDTO quizResponseDTO; @Operation(summary = "랜덤으로 퀴즈 내용 불러오기", description = "퀴즈를 보여줍니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + schema = @Schema(implementation = QuizResponseDTO.randomQuizResponseDTO.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -32,9 +34,11 @@ public class QuizController { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("") - public ApiResponse getQuiz(@RequestParam(name="userId") Long userId){ - Quiz quiz = quizService.getQuiz(); - return ApiResponse.onSuccess(QuizConverter.toGetQuizDto(userId, quiz)); + public ApiResponse> getQuiz(@RequestParam(name="userId") Long userId){ + Optional quiz = quizService.getQuiz(userId); + if(quiz.isPresent()) + return ApiResponse.onSuccess(quiz); + return null; } } diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java index 6dfa18c..77c39b0 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizRepository.java @@ -1,5 +1,6 @@ package com.finut.finut_server.domain.quiz; +import com.finut.finut_server.domain.difficulty.DifficultyType; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -11,4 +12,5 @@ public interface QuizRepository extends JpaRepository { + List findByDifficulty(DifficultyType quizDiff); } diff --git a/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java b/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java new file mode 100644 index 0000000..74dd70f --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quiz/QuizResponseDTO.java @@ -0,0 +1,22 @@ +package com.finut.finut_server.domain.quiz; + +import com.finut.finut_server.domain.difficulty.DifficultyType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class QuizResponseDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class randomQuizResponseDTO { + Long id; + DifficultyType difficulty; + String question; + AnswerType answer; + String description; + } +} diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java index 52f9037..e8e91c3 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -5,24 +5,16 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; -import org.springframework.web.service.annotation.GetExchange; @Entity @Getter @Setter public class QuizDone { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - @ManyToOne - @JoinColumn(name = "quiz_id", nullable = false) - private Quiz quiz; - - @ManyToOne - @JoinColumn(name = "user_id", nullable = false) - private Users userId; + @EmbeddedId + private QuizDoneId id; @Column(nullable = false) private Boolean isCorrect = false; + } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java new file mode 100644 index 0000000..1bb4efd --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java @@ -0,0 +1,38 @@ +package com.finut.finut_server.domain.quizDone; + +import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.user.Users; +import jakarta.persistence.Embeddable; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Objects; + +@Getter +@Setter +@Embeddable +public class QuizDoneId implements Serializable { + @ManyToOne + @JoinColumn(name = "quiz_id", nullable = false) + private Quiz quiz; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private Users user; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + QuizDoneId that = (QuizDoneId) o; + return Objects.equals(quiz, that.quiz) && Objects.equals(user, that.user); + } + + @Override + public int hashCode() { + return Objects.hash(quiz, user); + } +} diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java index a16bd92..0ec784e 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java @@ -1,6 +1,13 @@ package com.finut.finut_server.domain.quizDone; +import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.user.Users; import org.springframework.data.jpa.repository.JpaRepository; -public interface QuizDoneRepository extends JpaRepository { +import java.util.Optional; + +public interface QuizDoneRepository extends JpaRepository { + boolean existsByIdQuizAndIdUser(Quiz id_quiz, Users id_user); + + Optional findByIdUserId(Long userId); } diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index 6a18df4..ac2fa9d 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -1,15 +1,23 @@ package com.finut.finut_server.service; -import com.finut.finut_server.apiPayload.code.status.ErrorStatus; -import com.finut.finut_server.apiPayload.exception.GeneralException; +import com.finut.finut_server.domain.difficulty.Difficulty; +import com.finut.finut_server.domain.difficulty.DifficultyType; import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.quiz.QuizRepository; +import com.finut.finut_server.domain.quiz.QuizResponseDTO; +import com.finut.finut_server.domain.quizDone.QuizDoneRepository; +import com.finut.finut_server.domain.user.Users; +import com.finut.finut_server.domain.user.UsersRepository; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Optional; import java.util.Random; +import java.util.Set; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -18,22 +26,43 @@ public class QuizService { @Autowired private QuizRepository quizRepository; -// @Transactional -// public Quiz getQuiz(){ -// // displayed == 0 이면 조회 가능 -// Quiz quiz; -// while(true){ -// Random random = new Random(); -// Long randomNumber = random.nextLong(260) + 1; // 1부터 260까지의 숫자를 랜덤하게 뽑음 -// quiz = quizRepository.findById(randomNumber) -// .orElseThrow(() -> new GeneralException(ErrorStatus.INVALID_NUMBER)); -// if(quiz.getDisplayed() == 0) { -// quiz.setDisplayed(1); -// quiz = quizRepository.save(quiz); -// break; -// } -// } -// return quiz; -// } + @Autowired + private QuizDoneRepository quizDoneRepository; + + @Autowired + private UsersRepository usersRepository; + + private final Random random = new Random(); + + @Transactional + public Optional getQuiz(Long userId) { + Optional userOpt = usersRepository.findById(userId); + if (userOpt.isEmpty()) { + return Optional.empty(); + } + Users user = userOpt.get(); + + DifficultyType quizDiff = user.getDifficulty().getDifficulty(); + + // quizDiff에 해당하는 모든 퀴즈 찾기 + List allQuizzesByDiff = quizRepository.findByDifficulty(quizDiff); + + // 해당 사용자가 완료한 퀴즈 ID 목록 가져오기 + Set completedQuizIds = quizDoneRepository.findByIdUserId(userId).stream() + .map(quizDone -> quizDone.getId().getQuiz().getId()) + .collect(Collectors.toSet()); + + // 완료한 퀴즈는 제외한 남은 퀴즈 목록 생성 + List uncompletedQuizzes = allQuizzesByDiff.stream() + .filter(quiz -> !completedQuizIds.contains(quiz.getId())) + .toList(); + + // 남은 퀴즈가 없으면 Optional.empty() 반환 + if (uncompletedQuizzes.isEmpty()) { + return Optional.empty(); + } + // 남은 퀴즈 목록에서 랜덤하게 하나 선택하여 반환 + return Optional.of(uncompletedQuizzes.get(random.nextInt(uncompletedQuizzes.size()))); + } } From 2685f808ca6640735d97ddaacce483cf444633c5 Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 29 Oct 2024 04:35:07 +0900 Subject: [PATCH 22/52] =?UTF-8?q?#25=20Update=20todaySalary=20:=20?= =?UTF-8?q?=EC=B2=98=EC=9D=8C=20=EC=B6=9C=EC=84=9D=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0,=20=EA=B8=B0=EC=A1=B4=EC=97=90=20true?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=80=EC=9E=A5=EB=90=98=EC=96=B4=EC=9E=88?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=9E=88=EB=8A=94=20todaySalary=20?= =?UTF-8?q?=EA=B0=92=20false=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/finut/finut_server/service/UsersService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 539f9a2..597da2a 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -61,8 +61,9 @@ public UserResponseDTO.updateAttendance updateAttendDate(Long userId){ attend.setUser(user); attend.setAttendDate(formattedDate); attendRepository.save(attend); - + user.setTodaySalary(false); user.setAttendCount(user.getAttendCount() + 1); + usersRepository.save(user); // // 만약 연속 출석인 경우, XP 올리기 // if(hasFiveConsecutiveDays(userId)){ @@ -84,15 +85,17 @@ else if(user.getAttendCount() == 5){ // attendCount가 5가 되었다면 user.setTodaySalary(true); user.setAttendCount(0); + usersRepository.save(user); + Level level = levelRepository.findById(user.getLevel().getId()); user.setMoney(user.getMoney() + level.getSalary()); msg = "월급을 받았습니다!"; } else { user.setAttendCount(user.getAttendCount() + 1); + usersRepository.save(user); } } - usersRepository.save(user); UserResponseDTO.updateAttendance updateAttendance = UserResponseDTO.updateAttendance.builder() .userId(userId) From 6360478239662c58fc8347e012bd47b1fea6f015 Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 13:16:33 +0900 Subject: [PATCH 23/52] =?UTF-8?q?Update=20quizController:=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EA=B3=84=ED=9A=8D=20=EC=A3=BC=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/controller/QuizController.java | 13 ++++++++++++- .../controller/TodayNewsController.java | 6 +++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 3a06130..5c71738 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -10,9 +10,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.Null; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.net.http.HttpResponse; import java.util.Optional; @RestController @@ -38,7 +40,16 @@ public ApiResponse> getQuiz(@RequestParam(name="userId") Long use Optional quiz = quizService.getQuiz(userId); if(quiz.isPresent()) return ApiResponse.onSuccess(quiz); - return null; + return ApiResponse.onFailure("400", "퀴즈 내용을 제대로 가져오지 못했습니다", quiz); } + + // 퀴즈 맞췄을 때 api/ db 생성(isCorrect = true), diffQuizCnt++, levelQuizCnt++ + public ApiResponse quizCorrect() { + + + return ApiResponse.onSuccess("success"); + } + // 퀴즈 틀렸을 때 api/ db 생성(isCorrect = false) + } diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index 6c1c893..b911a93 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -24,7 +24,7 @@ public class TodayNewsController { @Operation(summary = "오늘의 뉴스 - 경제", description = "오늘의 뉴스 중 경제 부분의 뉴스들을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + schema = @Schema(implementation = String.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -44,7 +44,7 @@ public List newsEconomy() { @Operation(summary = "오늘의 뉴스 - 부동산", description = "오늘의 뉴스 중 부동산 부분의 뉴스들을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + schema = @Schema(implementation = String.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -64,7 +64,7 @@ public List newsRealEstate() { @Operation(summary = "오늘의 뉴스 - 증권", description = "오늘의 뉴스 중 증권 부분의 뉴스들을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.getQuizDto.class))), + schema = @Schema(implementation = String.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", From 0b255236eb276f4d4d95906395f1bcff50bf0aea Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 29 Oct 2024 14:07:51 +0900 Subject: [PATCH 24/52] =?UTF-8?q?Update=20domain:=20Quiz=20JPA=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TodayNewsController.java | 2 +- .../finut_server/converter/QuizConverter.java | 26 ------------------- .../domain/quizDone/QuizDone.java | 15 +++++++++-- .../domain/quizDone/QuizDoneId.java | 24 +++++------------ .../domain/quizDone/QuizDoneRepository.java | 2 +- .../finut/finut_server/domain/user/Users.java | 3 --- .../finut_server/service/QuizService.java | 2 +- 7 files changed, 23 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/com/finut/finut_server/converter/QuizConverter.java diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index dbc7966..1a991a1 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -3,7 +3,6 @@ import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.news.NewsItemDTO; import com.finut.finut_server.service.TodayNewsService; -import com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -11,6 +10,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/com/finut/finut_server/converter/QuizConverter.java b/src/main/java/com/finut/finut_server/converter/QuizConverter.java deleted file mode 100644 index 8afae97..0000000 --- a/src/main/java/com/finut/finut_server/converter/QuizConverter.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.finut.finut_server.converter; - -import com.finut.finut_server.domain.quiz.Quiz; - -public class QuizConverter { - - public static QuizResponseDTO.getQuizDto toGetQuizDto(Long userId, Quiz quiz){ - if(quiz == null) { - return QuizResponseDTO.getQuizDto.builder() - .userId(userId) - .quiz(null) - .build(); - } - return QuizResponseDTO.getQuizDto.builder() - .userId(userId) - .quiz(quiz) - .build(); - } - - public static QuizResponseDTO.updateMoneyDto toUpdateMoneyDto(Long userId, int moneyAmount){ - return QuizResponseDTO.updateMoneyDto.builder() - .userId(userId) - .moneyAmount(moneyAmount) - .build(); - } -} diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java index e8e91c3..c7a8b41 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -6,15 +6,26 @@ import lombok.Getter; import lombok.Setter; +import java.io.Serializable; + @Entity @Getter @Setter public class QuizDone { - @EmbeddedId private QuizDoneId id; - @Column(nullable = false) + @ManyToOne + @MapsId("quizId") + @JoinColumn(name = "quizId", insertable = false, updatable = false) + private Quiz quiz; + + @ManyToOne + @MapsId("userId") + @JoinColumn(name = "userId", insertable = false, updatable = false) + private Users user; + private Boolean isCorrect = false; } + diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java index 1bb4efd..03d17b7 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java @@ -1,38 +1,28 @@ package com.finut.finut_server.domain.quizDone; -import com.finut.finut_server.domain.quiz.Quiz; -import com.finut.finut_server.domain.user.Users; import jakarta.persistence.Embeddable; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import lombok.Getter; -import lombok.Setter; import java.io.Serializable; import java.util.Objects; -@Getter -@Setter @Embeddable public class QuizDoneId implements Serializable { - @ManyToOne - @JoinColumn(name = "quiz_id", nullable = false) - private Quiz quiz; - - @ManyToOne - @JoinColumn(name = "user_id", nullable = false) - private Users user; + private Long quizId; + private Long userId; + // equals 메서드 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; QuizDoneId that = (QuizDoneId) o; - return Objects.equals(quiz, that.quiz) && Objects.equals(user, that.user); + return Objects.equals(quizId, that.quizId) && + Objects.equals(userId, that.userId); } + // hashCode 메서드 @Override public int hashCode() { - return Objects.hash(quiz, user); + return Objects.hash(quizId, userId); } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java index 0ec784e..f19c6d0 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java @@ -7,7 +7,7 @@ import java.util.Optional; public interface QuizDoneRepository extends JpaRepository { - boolean existsByIdQuizAndIdUser(Quiz id_quiz, Users id_user); + boolean existsByIdQuizIdAndIdUserId(Long quizId, Long userId); Optional findByIdUserId(Long userId); } diff --git a/src/main/java/com/finut/finut_server/domain/user/Users.java b/src/main/java/com/finut/finut_server/domain/user/Users.java index fa91ada..81db9ea 100644 --- a/src/main/java/com/finut/finut_server/domain/user/Users.java +++ b/src/main/java/com/finut/finut_server/domain/user/Users.java @@ -2,13 +2,10 @@ import com.finut.finut_server.domain.BaseTimeEntity; -<<<<<<< HEAD import com.finut.finut_server.domain.difficulty.Difficulty; import com.finut.finut_server.domain.quizDone.QuizDone; -======= import com.finut.finut_server.domain.level.Level; import com.finut.finut_server.domain.level.LevelName; ->>>>>>> 5e5ef4c89f366717ff36179641ce7050c3b669a5 import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index ac2fa9d..6c00f45 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -49,7 +49,7 @@ public Optional getQuiz(Long userId) { // 해당 사용자가 완료한 퀴즈 ID 목록 가져오기 Set completedQuizIds = quizDoneRepository.findByIdUserId(userId).stream() - .map(quizDone -> quizDone.getId().getQuiz().getId()) + .map(quizDone -> quizDone.getQuiz().getId()) .collect(Collectors.toSet()); // 완료한 퀴즈는 제외한 남은 퀴즈 목록 생성 From 3d95798c6e444b30bc97d5c5eaaacecd0c2d7eff Mon Sep 17 00:00:00 2001 From: yeojin Date: Thu, 31 Oct 2024 22:47:53 +0900 Subject: [PATCH 25/52] =?UTF-8?q?Update=20Quiz=20:=20quiz=20=EB=A7=9E?= =?UTF-8?q?=EC=B7=84=EC=9D=84=20=EB=95=8C,=20=ED=8B=80=EB=A0=B8=EC=9D=84?= =?UTF-8?q?=20=EB=95=8C=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 9 ++ .../finut_server/config/SecurityConfig.java | 1 + .../controller/QuizController.java | 114 +++++++++++++++++- .../domain/quizDone/QuizDone.java | 2 - .../service/GoogleAuthService.java | 36 ++++++ .../finut_server/service/QuizDoneService.java | 27 +++++ .../finut_server/service/QuizService.java | 8 +- .../finut_server/service/UsersService.java | 18 ++- 8 files changed, 204 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/finut/finut_server/service/GoogleAuthService.java create mode 100644 src/main/java/com/finut/finut_server/service/QuizDoneService.java diff --git a/build.gradle b/build.gradle index f1f02e9..e247cf9 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,15 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + // Google Auth Library for OAuth 2.0 + implementation 'com.google.auth:google-auth-library-oauth2-http:1.8.0' + + // Google API Client Library for OAuth2 + implementation 'com.google.apis:google-api-services-oauth2:v2-rev151-1.25.0' + + // JSON Parsing (Gson) + implementation 'com.google.http-client:google-http-client-gson:1.41.6' + // mysql 설정 runtimeOnly 'com.mysql:mysql-connector-j' diff --git a/src/main/java/com/finut/finut_server/config/SecurityConfig.java b/src/main/java/com/finut/finut_server/config/SecurityConfig.java index 8ebd7f5..ccc1621 100644 --- a/src/main/java/com/finut/finut_server/config/SecurityConfig.java +++ b/src/main/java/com/finut/finut_server/config/SecurityConfig.java @@ -4,6 +4,7 @@ import com.finut.finut_server.apiPayload.exception.handler.CustomOAuth2AuthenticationSuccessHandler; import com.finut.finut_server.config.auth.CustomOAuth2UserService; import com.finut.finut_server.domain.user.UsersRepository; +import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 5c71738..65f916a 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -4,17 +4,25 @@ import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.quiz.QuizResponseDTO; +import com.finut.finut_server.domain.user.Users; +import com.finut.finut_server.service.GoogleAuthService; +import com.finut.finut_server.service.QuizDoneService; import com.finut.finut_server.service.QuizService; +import com.finut.finut_server.service.UsersService; +import com.google.api.services.oauth2.model.Userinfoplus; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.constraints.Null; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.net.http.HttpResponse; +import java.io.IOException; import java.util.Optional; @RestController @@ -23,8 +31,24 @@ public class QuizController { @Autowired private QuizService quizService; + + @Autowired + private final GoogleAuthService googleAuthService; + + @Autowired + private final UsersService usersService; + + @Autowired + private final QuizDoneService quizDoneService; private QuizResponseDTO quizResponseDTO; + @Autowired + public QuizController(GoogleAuthService googleAuthService, UsersService usersService, QuizDoneService quizDoneService) { + this.googleAuthService = googleAuthService; + this.usersService = usersService; + this.quizDoneService = quizDoneService; + } + @Operation(summary = "랜덤으로 퀴즈 내용 불러오기", description = "퀴즈를 보여줍니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", @@ -44,12 +68,94 @@ public ApiResponse> getQuiz(@RequestParam(name="userId") Long use } + // 퀴즈 맞췄을 때 api/ db 생성(isCorrect = true), diffQuizCnt++, levelQuizCnt++ - public ApiResponse quizCorrect() { + @GetMapping("/correct/{quizId}") + public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { + // Authorization 헤더에서 Access Token을 가져옵니다. + String header = request.getHeader("Authorization"); + Users user; + Optional quiz; + + if (header != null && header.startsWith("Bearer ")) +// if(true) + { + String accessToken = header.substring(7); // "Bearer " 제거 +// String accessToken; + try { + // Access Token을 이용해 사용자 정보를 조회합니다. + Userinfoplus userInfo = googleAuthService.getUserInfo(accessToken); +// System.out.println("User ID: " + userInfo.getId()); +// System.out.println("User Email: " + userInfo.getEmail()); + // 필요한 경우 userInfo 객체를 SecurityContext에 저장해 인증 정보를 유지할 수 있습니다. - return ApiResponse.onSuccess("success"); +// System.out.println("User: " + usersService.getUserIdByEmail(userInfo.getEmail()).getId()); +// userId = usersService.getUserIdByEmail(userInfo.getEmail()).getId(); + user = usersService.getUserIdByEmail(userInfo.getEmail()); + quiz = quizService.getQuizByQuizId(quizId); + + if (quiz.isPresent()) { + quizDoneService.saveQuizDone(user, quiz, true); //db 생성(isCorrect = true) + usersService.updateDiffLevelCnt(user.getId()); //diffQuizCnt++, levelQuizCnt++ + // 성공 응답 반환 + return ApiResponse.onSuccess("success"); + } + else + return ApiResponse.onFailure("500", "No Quiz", "data"); + + + } catch (Exception e) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return ApiResponse.onFailure("500", "Invalid or expired access token.", "data"); + } + } else { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return ApiResponse.onFailure("500", "Authorization header missing or malformed.", "data"); + } } + // 퀴즈 틀렸을 때 api/ db 생성(isCorrect = false) + @GetMapping("/wrong/{quizId}") + public ApiResponse quizWrong(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { + // Authorization 헤더에서 Access Token을 가져옵니다. + String header = request.getHeader("Authorization"); + Users user; + Optional quiz; + + if (header != null && header.startsWith("Bearer ")) +// if(true) + { + String accessToken = header.substring(7); // "Bearer " 제거 +// String accessToken; + + try { + // Access Token을 이용해 사용자 정보를 조회합니다. + Userinfoplus userInfo = googleAuthService.getUserInfo(accessToken); +// System.out.println("User ID: " + userInfo.getId()); +// System.out.println("User Email: " + userInfo.getEmail()); +// System.out.println("User: " + usersService.getUserIdByEmail(userInfo.getEmail()).getId()); +// userId = usersService.getUserIdByEmail(userInfo.getEmail()).getId(); + user = usersService.getUserIdByEmail(userInfo.getEmail()); + quiz = quizService.getQuizByQuizId(quizId); + + if (quiz.isPresent()) { + quizDoneService.saveQuizDone(user, quiz, false); //db 생성(isCorrect = false) + // 성공 응답 반환 + return ApiResponse.onSuccess("success"); + } + else + return ApiResponse.onFailure("500", "No Quiz", "data"); + + + } catch (Exception e) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return ApiResponse.onFailure("500", "Invalid or expired access token.", "data"); + } + } else { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return ApiResponse.onFailure("500", "Authorization header missing or malformed.", "data"); + } + } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java index c7a8b41..d673216 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -6,8 +6,6 @@ import lombok.Getter; import lombok.Setter; -import java.io.Serializable; - @Entity @Getter @Setter diff --git a/src/main/java/com/finut/finut_server/service/GoogleAuthService.java b/src/main/java/com/finut/finut_server/service/GoogleAuthService.java new file mode 100644 index 0000000..ef123e8 --- /dev/null +++ b/src/main/java/com/finut/finut_server/service/GoogleAuthService.java @@ -0,0 +1,36 @@ +package com.finut.finut_server.service; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Collections; + +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.oauth2.Oauth2; +import com.google.api.services.oauth2.model.Userinfoplus; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.GoogleCredentials; +import org.springframework.stereotype.Service; + +@Service +public class GoogleAuthService { + public Userinfoplus getUserInfo(String accessToken) throws IOException, GeneralSecurityException { + // GoogleCredentials로 Access Token 설정 + GoogleCredentials credentials = GoogleCredentials.create(new AccessToken(accessToken, null)); + + // Oauth2 서비스 생성 + Oauth2 oauth2 = new Oauth2.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + GsonFactory.getDefaultInstance(), // GsonFactory 사용 + new HttpCredentialsAdapter(credentials)) + .setApplicationName("Finut") + .build(); + + // 사용자 정보 요청 + return oauth2.userinfo().get().execute(); + } +} diff --git a/src/main/java/com/finut/finut_server/service/QuizDoneService.java b/src/main/java/com/finut/finut_server/service/QuizDoneService.java new file mode 100644 index 0000000..78d5cf3 --- /dev/null +++ b/src/main/java/com/finut/finut_server/service/QuizDoneService.java @@ -0,0 +1,27 @@ +package com.finut.finut_server.service; + +import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.quizDone.QuizDone; +import com.finut.finut_server.domain.quizDone.QuizDoneRepository; +import com.finut.finut_server.domain.user.Users; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class QuizDoneService { + + @Autowired + QuizDoneRepository quizDoneRepository; + + QuizDone quizDone; + + public void saveQuizDone(Users user, Optional quiz, boolean isCorrect) { + quizDone.setQuiz(quiz); + quizDone.setUser(user); + quizDone.setIsCorrect(isCorrect); + quizDoneRepository.save(quizDone); + } + +} diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index 6c00f45..003c627 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -1,10 +1,8 @@ package com.finut.finut_server.service; -import com.finut.finut_server.domain.difficulty.Difficulty; import com.finut.finut_server.domain.difficulty.DifficultyType; import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.quiz.QuizRepository; -import com.finut.finut_server.domain.quiz.QuizResponseDTO; import com.finut.finut_server.domain.quizDone.QuizDoneRepository; import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.domain.user.UsersRepository; @@ -65,4 +63,10 @@ public Optional getQuiz(Long userId) { // 남은 퀴즈 목록에서 랜덤하게 하나 선택하여 반환 return Optional.of(uncompletedQuizzes.get(random.nextInt(uncompletedQuizzes.size()))); } + + + public Optional getQuizByQuizId(Long quizId) { + return quizRepository.findById(quizId); + + } } diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 597da2a..e1f0f7f 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -10,15 +10,13 @@ import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.domain.user.UsersRepository; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -132,5 +130,19 @@ public boolean hasFiveConsecutiveDays(Long userId) { } return true; } + + public Users getUserIdByEmail(String email) { + return usersRepository.findByEmail(email) + .orElseThrow(() -> new RuntimeException("User not found with email: " + email)); + } + + public void updateDiffLevelCnt(Long userId) { + Users user = usersRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("User not found with id: " + userId)); + + user.setDiffQuizCount(user.getDiffQuizCount() + 1); // diffQuizCnt 증가 + user.setLevelQuizCount(user.getLevelQuizCount() + 1); // levelQuizCnt 증가 + usersRepository.save(user); // 변경사항 저장 + } } From 24fc4f2872a9524190beab45e6e4f91426cc5dfc Mon Sep 17 00:00:00 2001 From: yeojin Date: Fri, 1 Nov 2024 17:19:58 +0900 Subject: [PATCH 26/52] =?UTF-8?q?Update=20Quiz:=20Header=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=ED=86=A0=ED=81=B0=20=EA=B0=80=EC=A0=B8=EC=99=80=EC=84=9C=20?= =?UTF-8?q?Id=20=EC=B0=BE=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuizController.java | 104 ++++-------------- .../domain/quizDone/QuizDone.java | 2 + .../finut_server/service/QuizDoneService.java | 2 +- .../finut_server/service/UsersService.java | 36 +++++- .../controller/QuizControllerTest.java | 2 + 5 files changed, 64 insertions(+), 82 deletions(-) create mode 100644 src/test/java/com/finut/finut_server/controller/QuizControllerTest.java diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 65f916a..a545f62 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -60,8 +60,9 @@ public QuizController(GoogleAuthService googleAuthService, UsersService usersSer schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("") - public ApiResponse> getQuiz(@RequestParam(name="userId") Long userId){ - Optional quiz = quizService.getQuiz(userId); + public ApiResponse> getQuiz(HttpServletRequest request, HttpServletResponse response){ + Users user = usersService.getUserIdByToken(request, response); + Optional quiz = quizService.getQuiz(user.getId()); if(quiz.isPresent()) return ApiResponse.onSuccess(quiz); return ApiResponse.onFailure("400", "퀴즈 내용을 제대로 가져오지 못했습니다", quiz); @@ -71,90 +72,33 @@ public ApiResponse> getQuiz(@RequestParam(name="userId") Long use // 퀴즈 맞췄을 때 api/ db 생성(isCorrect = true), diffQuizCnt++, levelQuizCnt++ @GetMapping("/correct/{quizId}") - public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { - // Authorization 헤더에서 Access Token을 가져옵니다. - String header = request.getHeader("Authorization"); - Users user; - Optional quiz; - - if (header != null && header.startsWith("Bearer ")) -// if(true) - { - String accessToken = header.substring(7); // "Bearer " 제거 -// String accessToken; - - try { - // Access Token을 이용해 사용자 정보를 조회합니다. - Userinfoplus userInfo = googleAuthService.getUserInfo(accessToken); -// System.out.println("User ID: " + userInfo.getId()); -// System.out.println("User Email: " + userInfo.getEmail()); - // 필요한 경우 userInfo 객체를 SecurityContext에 저장해 인증 정보를 유지할 수 있습니다. - -// System.out.println("User: " + usersService.getUserIdByEmail(userInfo.getEmail()).getId()); -// userId = usersService.getUserIdByEmail(userInfo.getEmail()).getId(); - user = usersService.getUserIdByEmail(userInfo.getEmail()); - quiz = quizService.getQuizByQuizId(quizId); - - if (quiz.isPresent()) { - quizDoneService.saveQuizDone(user, quiz, true); //db 생성(isCorrect = true) - usersService.updateDiffLevelCnt(user.getId()); //diffQuizCnt++, levelQuizCnt++ - // 성공 응답 반환 - return ApiResponse.onSuccess("success"); - } - else - return ApiResponse.onFailure("500", "No Quiz", "data"); - - - } catch (Exception e) { - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - return ApiResponse.onFailure("500", "Invalid or expired access token.", "data"); - } - } else { - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return ApiResponse.onFailure("500", "Authorization header missing or malformed.", "data"); + public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + Users user = usersService.getUserIdByToken(request, response); + Optional quiz = quizService.getQuizByQuizId(quizId); + + if (quiz.isPresent()) { + quizDoneService.saveQuizDone(user, quiz.get(), true); //db 생성(isCorrect = true) + usersService.updateDiffLevelCnt(user.getId()); //diffQuizCnt++, levelQuizCnt++ + // 성공 응답 반환 + return ApiResponse.onSuccess("success"); + } + else { + return ApiResponse.onFailure("500", "No Quiz", "data"); } } // 퀴즈 틀렸을 때 api/ db 생성(isCorrect = false) @GetMapping("/wrong/{quizId}") - public ApiResponse quizWrong(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { - // Authorization 헤더에서 Access Token을 가져옵니다. - String header = request.getHeader("Authorization"); - Users user; - Optional quiz; - - if (header != null && header.startsWith("Bearer ")) -// if(true) - { - String accessToken = header.substring(7); // "Bearer " 제거 -// String accessToken; - - try { - // Access Token을 이용해 사용자 정보를 조회합니다. - Userinfoplus userInfo = googleAuthService.getUserInfo(accessToken); -// System.out.println("User ID: " + userInfo.getId()); -// System.out.println("User Email: " + userInfo.getEmail()); -// System.out.println("User: " + usersService.getUserIdByEmail(userInfo.getEmail()).getId()); -// userId = usersService.getUserIdByEmail(userInfo.getEmail()).getId(); - user = usersService.getUserIdByEmail(userInfo.getEmail()); - quiz = quizService.getQuizByQuizId(quizId); - - if (quiz.isPresent()) { - quizDoneService.saveQuizDone(user, quiz, false); //db 생성(isCorrect = false) - // 성공 응답 반환 - return ApiResponse.onSuccess("success"); - } - else - return ApiResponse.onFailure("500", "No Quiz", "data"); - - - } catch (Exception e) { - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - return ApiResponse.onFailure("500", "Invalid or expired access token.", "data"); - } + public ApiResponse quizWrong(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + Users user = usersService.getUserIdByToken(request, response); + Optional quiz = quizService.getQuizByQuizId(quizId); + + if (quiz.isPresent()) { + quizDoneService.saveQuizDone(user, quiz.get(), false); //db 생성(isCorrect = false) + // 성공 응답 반환 + return ApiResponse.onSuccess("success"); } else { - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return ApiResponse.onFailure("500", "Authorization header missing or malformed.", "data"); + return ApiResponse.onFailure("500", "No Quiz", "data"); } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java index d673216..d8dcff6 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -6,6 +6,8 @@ import lombok.Getter; import lombok.Setter; +import java.util.Optional; + @Entity @Getter @Setter diff --git a/src/main/java/com/finut/finut_server/service/QuizDoneService.java b/src/main/java/com/finut/finut_server/service/QuizDoneService.java index 78d5cf3..8750d54 100644 --- a/src/main/java/com/finut/finut_server/service/QuizDoneService.java +++ b/src/main/java/com/finut/finut_server/service/QuizDoneService.java @@ -17,7 +17,7 @@ public class QuizDoneService { QuizDone quizDone; - public void saveQuizDone(Users user, Optional quiz, boolean isCorrect) { + public void saveQuizDone(Users user, Quiz quiz, boolean isCorrect) { quizDone.setQuiz(quiz); quizDone.setUser(user); quizDone.setIsCorrect(isCorrect); diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index e1f0f7f..829dc93 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -6,11 +6,15 @@ import com.finut.finut_server.domain.attend.AttendRepository; import com.finut.finut_server.domain.level.Level; import com.finut.finut_server.domain.level.LevelRepository; +import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.user.UserResponseDTO; import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.domain.user.UsersRepository; +import com.google.api.services.oauth2.model.Userinfoplus; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; -import lombok.Setter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @@ -33,6 +37,8 @@ public class UsersService { @Autowired private LevelRepository levelRepository; + GoogleAuthService googleAuthService; + public void saveRefreshToken(String email, String refreshToken) { Optional optionalUser = usersRepository.findByEmail(email); if (optionalUser.isPresent()) { @@ -144,5 +150,33 @@ public void updateDiffLevelCnt(Long userId) { user.setLevelQuizCount(user.getLevelQuizCount() + 1); // levelQuizCnt 증가 usersRepository.save(user); // 변경사항 저장 } + + public Users getUserIdByToken(HttpServletRequest request, HttpServletResponse response) { + // Authorization 헤더에서 Access Token을 가져옵니다. + String header = request.getHeader("Authorization"); + Users user; + Optional quiz; + + if (header != null && header.startsWith("Bearer ")) +// if(true) + { + String accessToken = header.substring(7); // "Bearer " 제거 +// String accessToken = "ya29.a0AeDClZCXQpR9Pb1ZRQSh5SrNYPTqX3NRJRAJRxxRif17PYzuEJuiFfeuVVM0VBee9S2FAPLKrieDazlPK7jL69LtIw2YGPU2yOqhQVvUMGEXJ2e6K9Tedpsc7A84ut1azP7IlpmjzmW1aAGYfoloJ3MFFBuF-2XZCgnEIx4FaCgYKAQgSARMSFQHGX2Mip5IYMEzhkNcsRTikuilkKQ0175"; + + try { + // Access Token을 이용해 사용자 정보를 조회합니다. + Userinfoplus userInfo = googleAuthService.getUserInfo(accessToken); + user = getUserIdByEmail(userInfo.getEmail()); + return user; + + } catch (Exception e) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return null; + } + } else { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return null; + } + } } diff --git a/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java b/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java new file mode 100644 index 0000000..344e8fa --- /dev/null +++ b/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java @@ -0,0 +1,2 @@ +package com.finut.finut_server.controller;public class QuizControllerTest { +} From e79aa8b9099a48ca74df93310d819a6bf9c9d06a Mon Sep 17 00:00:00 2001 From: yeojin Date: Fri, 1 Nov 2024 17:23:37 +0900 Subject: [PATCH 27/52] =?UTF-8?q?Update=20ConsumptionController:=20Header?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=ED=86=A0=ED=81=B0=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=99=80=EC=84=9C=20UserId=20=EC=B0=BE=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConsumptionController.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/ConsumptionController.java b/src/main/java/com/finut/finut_server/controller/ConsumptionController.java index b3ae987..d883097 100644 --- a/src/main/java/com/finut/finut_server/controller/ConsumptionController.java +++ b/src/main/java/com/finut/finut_server/controller/ConsumptionController.java @@ -5,14 +5,18 @@ import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.product.Product; import com.finut.finut_server.domain.purchases.Purchases; +import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.service.ConsumptionService; import com.finut.finut_server.service.PurchasesService; +import com.finut.finut_server.service.UsersService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -27,6 +31,8 @@ public class ConsumptionController { private final ConsumptionService consumptionService; private final PurchasesService purchasesService; + private UsersService usersService; + @Autowired public ConsumptionController(ConsumptionService consumptionService, PurchasesService purchasesService) { this.consumptionService = consumptionService; @@ -73,8 +79,9 @@ public ApiResponse> readProduct(@PathVariable Long productId) }) @Operation(summary = "물품 구매", description = "물품을 구매하기 위한 api 입니다") @GetMapping("/buy") - public ApiResponse buyProduct(@RequestParam Long userId, @RequestParam Long productId) { - return ApiResponse.onSuccess(PurchasesService.buyProduct(userId, productId)); + public ApiResponse buyProduct(@RequestParam Long productId, HttpServletRequest request, HttpServletResponse response) { + Users user = usersService.getUserIdByToken(request, response); + return ApiResponse.onSuccess(PurchasesService.buyProduct(user.getId(), productId)); } @ApiResponses(value = { @@ -88,7 +95,8 @@ public ApiResponse buyProduct(@RequestParam Long userId, @RequestPara }) @Operation(summary = "내 물품 보기", description = "구매한 물품들을 모두 위한 api 입니다") @GetMapping("/my-purchases") - public ApiResponse> readMyPurchases(@RequestParam Long userId) { - return ApiResponse.onSuccess(PurchasesService.getMyProducts(userId)); + public ApiResponse> readMyPurchases(HttpServletRequest request, HttpServletResponse response) { + Users user = usersService.getUserIdByToken(request, response); + return ApiResponse.onSuccess(PurchasesService.getMyProducts(user.getId())); } } From 44a5c6e0594808c18b200d3f39846f19d6e437ff Mon Sep 17 00:00:00 2001 From: yeojin Date: Fri, 1 Nov 2024 17:26:58 +0900 Subject: [PATCH 28/52] =?UTF-8?q?Delete=20Interest:=20=EA=B8=88=EB=A6=AC?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/InterestRateController.java | 66 ------ .../service/InterestRateService.java | 197 ------------------ .../InterestRateControllerTest.java | 51 ----- 3 files changed, 314 deletions(-) delete mode 100644 src/main/java/com/finut/finut_server/controller/InterestRateController.java delete mode 100644 src/main/java/com/finut/finut_server/service/InterestRateService.java delete mode 100644 src/test/java/com/finut/finut_server/controller/InterestRateControllerTest.java diff --git a/src/main/java/com/finut/finut_server/controller/InterestRateController.java b/src/main/java/com/finut/finut_server/controller/InterestRateController.java deleted file mode 100644 index 4fb2c6b..0000000 --- a/src/main/java/com/finut/finut_server/controller/InterestRateController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.finut.finut_server.controller; - -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.finut.finut_server.apiPayload.ApiResponse; -import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; -import com.finut.finut_server.service.InterestRateService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -@Tag(name = "InterestRate Controller", description = "금리 데이터 api") -@RequestMapping("/interest-rate") -@RestController -public class InterestRateController { - @Autowired - private InterestRateService interestRateService; - - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = String.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", - content = @Content), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", - content = @Content(mediaType = "application/json", - schema = @Schema(implementation = ErrorReasonDTO.class))) - }) - @Operation(summary = "오늘의 금리 정보", description = "오늘의 금리 정보를 가져오기 위한 api 입니다.") - @GetMapping("/today") - public ApiResponse getInterestRatesToday() { - return ApiResponse.onSuccess(interestRateService.getInterestRatesToady()); - } - - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = ArrayNode.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", - content = @Content), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", - content = @Content(mediaType = "application/json", - schema = @Schema(implementation = ErrorReasonDTO.class))) - }) - @Operation(summary = "3개년 금리 정보", description = "3년의 금리 정보를 가져오기 위한 api 입니다") - @GetMapping("/3") - public ApiResponse getInterestRates3Y() { - return ApiResponse.onSuccess(interestRateService.getInterestRates3Y()); - } - - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = ArrayNode.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", - content = @Content), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", - content = @Content(mediaType = "application/json", - schema = @Schema(implementation = ErrorReasonDTO.class))) - }) - @Operation(summary = "5개년 금리 정보", description = "5년의 금리 정보를 가져오기 위한 api 입니다") - @GetMapping("/5") - public ApiResponse getInterestRates5Y() { - return ApiResponse.onSuccess(interestRateService.getInterestRates5Y()); - } -} diff --git a/src/main/java/com/finut/finut_server/service/InterestRateService.java b/src/main/java/com/finut/finut_server/service/InterestRateService.java deleted file mode 100644 index b14372a..0000000 --- a/src/main/java/com/finut/finut_server/service/InterestRateService.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.finut.finut_server.service; - -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.net.URI; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; - -@Service -public class InterestRateService { - @Value("${bank.api.base-url}") - private String baseUrl; - - @Value("${bank.api.key}") - private String apiKey; - - private final RestTemplate restTemplate; - - LocalDate today = LocalDate.now(); - - private int yearValue = today.getYear(); - private int monthValue = today.getMonthValue(); - - String startDate; - final String endDate = Integer.toString(yearValue) + String.format("%02d", monthValue); - - public InterestRateService () { - this.restTemplate = new RestTemplate(); - } - - public String getInterestRatesToady() { - if(monthValue == 1) { - startDate = Integer.toString(yearValue - 1) + "12"; - } - else - { - startDate = Integer.toString(yearValue) + "01"; - } - - URI uri = UriComponentsBuilder.fromHttpUrl(baseUrl) - .pathSegment("StatisticSearch") - .pathSegment(apiKey) - .pathSegment("JSON") - .pathSegment("kr") - .pathSegment("1") // 요청시작건수 - .pathSegment("12") // 요청종료건수 - .pathSegment("722Y001") // 통계표코드 - .pathSegment("M") // 주기 - .pathSegment(startDate) // 검색시작일자 - .pathSegment(endDate) // 검색종료일자 - .pathSegment("0101000") // 통계항목코드1 - .pathSegment("?") // 통계항목코드2 - .pathSegment("?") // 통계항목코드3 - .pathSegment("?") // 통계항목코드4 - .build() - .toUri(); - - String response = restTemplate.getForObject(uri, String.class); - - return extractLastDataValue(response); - } - - private String extractLastDataValue(String jsonResponse) { - try { - ObjectMapper mapper = new ObjectMapper(); - JsonNode rootNode = mapper.readTree(jsonResponse); - - JsonNode rows = rootNode.path("StatisticSearch").path("row"); - - String dataValue; - if (rows.isArray() && rows.size() > 0) { - JsonNode lastRow = rows.get(rows.size() - 1); - dataValue = lastRow.path("DATA_VALUE").asText(); - } else { - dataValue = "No data available"; - } - - return dataValue; - } catch (Exception e) { - e.printStackTrace(); - ObjectNode errorNode = new ObjectMapper().createObjectNode(); - errorNode.put("result", "Error processing data"); - return errorNode.toString(); - } - } - - public ArrayNode getInterestRates3Y() { - startDate = Integer.toString(yearValue - 3) + String.format("%02d", monthValue); - - URI uri = UriComponentsBuilder.fromHttpUrl(baseUrl) - .pathSegment("StatisticSearch") - .pathSegment(apiKey) - .pathSegment("JSON") - .pathSegment("kr") - .pathSegment("1") // 요청시작건수 - .pathSegment("36") // 요청종료건수 - .pathSegment("722Y001") // 통계표코드 - .pathSegment("M") // 주기 - .pathSegment(startDate) // 검색시작일자 - .pathSegment(endDate) // 검색종료일자 - .pathSegment("0101000") // 통계항목코드1 - .pathSegment("?") // 통계항목코드2 - .pathSegment("?") // 통계항목코드3 - .pathSegment("?") // 통계항목코드4 - .build() - .toUri(); - - String response = restTemplate.getForObject(uri, String.class); - - try { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode rootNode = objectMapper.readTree(response); - JsonNode rowNode = rootNode.path("StatisticSearch").path("row"); - - ArrayNode resultArray = objectMapper.createArrayNode(); - - if (rowNode.isArray()) { - for (JsonNode node : rowNode) { - String time = node.path("TIME").asText(); - String dataValue = node.path("DATA_VALUE").asText(); - - ObjectNode newNode = objectMapper.createObjectNode(); - newNode.put("TIME", time); - newNode.put("DATA_VALUE", dataValue); - - resultArray.add(newNode); - } - } - - return resultArray; - - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public ArrayNode getInterestRates5Y() { - startDate = Integer.toString(yearValue - 5) + String.format("%02d", monthValue); - - URI uri = UriComponentsBuilder.fromHttpUrl(baseUrl) - .pathSegment("StatisticSearch") - .pathSegment(apiKey) - .pathSegment("JSON") - .pathSegment("kr") - .pathSegment("1") // 요청시작건수 - .pathSegment("60") // 요청종료건수 - .pathSegment("722Y001") // 통계표코드 - .pathSegment("M") // 주기 - .pathSegment(startDate) // 검색시작일자 - .pathSegment(endDate) // 검색종료일자 - .pathSegment("0101000") // 통계항목코드1 - .pathSegment("?") // 통계항목코드2 - .pathSegment("?") // 통계항목코드3 - .pathSegment("?") // 통계항목코드4 - .build() - .toUri(); - - String response = restTemplate.getForObject(uri, String.class); - - try { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode rootNode = objectMapper.readTree(response); - JsonNode rowNode = rootNode.path("StatisticSearch").path("row"); - - ArrayNode resultArray = objectMapper.createArrayNode(); - - if (rowNode.isArray()) { - for (JsonNode node : rowNode) { - String time = node.path("TIME").asText(); - String dataValue = node.path("DATA_VALUE").asText(); - - ObjectNode newNode = objectMapper.createObjectNode(); - newNode.put("TIME", time); - newNode.put("DATA_VALUE", dataValue); - - resultArray.add(newNode); - } - } - - return resultArray; - - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/src/test/java/com/finut/finut_server/controller/InterestRateControllerTest.java b/src/test/java/com/finut/finut_server/controller/InterestRateControllerTest.java deleted file mode 100644 index e4f454a..0000000 --- a/src/test/java/com/finut/finut_server/controller/InterestRateControllerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.finut.finut_server.controller; - -import com.finut.finut_server.service.InterestRateService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@SpringBootTest -public class InterestRateControllerTest { - - @Autowired - private WebApplicationContext context; - - private MockMvc mockMvc; - - @MockBean - private InterestRateService interestRateService; - - @BeforeEach - public void setUp() { - mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - } - - @Test - public void testGetInterestRates() throws Exception { - String expectedResponse = "3.5"; - - when(interestRateService.getInterestRatesToady()).thenReturn(expectedResponse); - - mockMvc.perform(get("/interest-rate/today")) - .andExpect(status().isOk()) - .andExpect(content().string(expectedResponse)); - - verify(interestRateService, times(1)).getInterestRatesToady(); - } - - - -} From c8393fe7bf262c0c322497fcde55ebb6d9afa155 Mon Sep 17 00:00:00 2001 From: yeojin Date: Fri, 1 Nov 2024 17:34:05 +0900 Subject: [PATCH 29/52] =?UTF-8?q?Update=20QuizController:=20swagger=20anno?= =?UTF-8?q?tation=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuizController.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index a545f62..13ece50 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -49,7 +49,7 @@ public QuizController(GoogleAuthService googleAuthService, UsersService usersSer this.quizDoneService = quizDoneService; } - @Operation(summary = "랜덤으로 퀴즈 내용 불러오기", description = "퀴즈를 보여줍니다.") + @Operation(summary = "랜덤으로 퀴즈 내용 불러오기", description = "유저가 풀지 않았던 문제 중에서 퀴즈를 랜덤으로 하나 가져옵니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = QuizResponseDTO.randomQuizResponseDTO.class))), @@ -70,6 +70,16 @@ public ApiResponse> getQuiz(HttpServletRequest request, HttpServl + @Operation(summary = "퀴즈를 맞췄을 때", description = "퀴즈를 맞췄을 때 QuizDone DB에 해당 내용을 저장하고, 난이도 상승에 필요한 퀴즈 개수와 레벨업에 필요한 퀴즈 개수를 증가시킵니다.") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.randomQuizResponseDTO.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) // 퀴즈 맞췄을 때 api/ db 생성(isCorrect = true), diffQuizCnt++, levelQuizCnt++ @GetMapping("/correct/{quizId}") public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { @@ -87,7 +97,18 @@ public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletReq } } + // 퀴즈 틀렸을 때 api/ db 생성(isCorrect = false) + @Operation(summary = "퀴즈를 틀렸을 때", description = "퀴즈를 틀렸을 때, 틀렸다는 정보를 저장합니다.") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuizResponseDTO.randomQuizResponseDTO.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) @GetMapping("/wrong/{quizId}") public ApiResponse quizWrong(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { Users user = usersService.getUserIdByToken(request, response); From f6def471d6050d67a0434fdd098aa53d93550b4d Mon Sep 17 00:00:00 2001 From: yeojin Date: Fri, 1 Nov 2024 17:39:22 +0900 Subject: [PATCH 30/52] =?UTF-8?q?Update=20QuizService:=20=EC=98=88?= =?UTF-8?q?=EC=8B=9C=EB=A1=9C=20=EB=84=A3=EC=97=88=EB=8D=98=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=82=AD=EC=A0=9C=20....?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/finut/finut_server/service/UsersService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 829dc93..50d62ea 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -158,11 +158,8 @@ public Users getUserIdByToken(HttpServletRequest request, HttpServletResponse re Optional quiz; if (header != null && header.startsWith("Bearer ")) -// if(true) { String accessToken = header.substring(7); // "Bearer " 제거 -// String accessToken = "ya29.a0AeDClZCXQpR9Pb1ZRQSh5SrNYPTqX3NRJRAJRxxRif17PYzuEJuiFfeuVVM0VBee9S2FAPLKrieDazlPK7jL69LtIw2YGPU2yOqhQVvUMGEXJ2e6K9Tedpsc7A84ut1azP7IlpmjzmW1aAGYfoloJ3MFFBuF-2XZCgnEIx4FaCgYKAQgSARMSFQHGX2Mip5IYMEzhkNcsRTikuilkKQ0175"; - try { // Access Token을 이용해 사용자 정보를 조회합니다. Userinfoplus userInfo = googleAuthService.getUserInfo(accessToken); From 553f6bd9acccc5fa0bac94ccb02ef57c1dcc52c6 Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 5 Nov 2024 23:33:30 +0900 Subject: [PATCH 31/52] =?UTF-8?q?#25=20Update=20updateAttendDate=20:=20?= =?UTF-8?q?=EC=97=B0=EC=86=8D=20=EC=B6=9C=EC=84=9D=EC=9D=BC=EC=88=98=205?= =?UTF-8?q?=EB=B2=88=20=EB=B0=8F=20XP=20100=20=EC=9D=B4=EC=83=81=20?= =?UTF-8?q?=EB=8B=AC=EC=84=B1=20=EC=8B=9C,=20=EC=8A=B9=EA=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserController.java | 4 +- .../domain/level/LevelRepository.java | 2 +- .../finut/finut_server/domain/user/Users.java | 3 + .../finut_server/service/UsersService.java | 86 ++++++++----------- 4 files changed, 41 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/UserController.java b/src/main/java/com/finut/finut_server/controller/UserController.java index 8d2a9df..15ccacd 100644 --- a/src/main/java/com/finut/finut_server/controller/UserController.java +++ b/src/main/java/com/finut/finut_server/controller/UserController.java @@ -14,13 +14,13 @@ import org.springframework.web.bind.annotation.*; @Tag(name = "User Controller", description = "사용자 관련 api") -@RequestMapping("/user") +@RequestMapping("/attend") @RestController public class UserController { @Autowired private UsersService usersService; - @Operation(summary = "월급 받기", description = "출석체크 수가 5의 배수면 월급을 받는 API 입니다.") + @Operation(summary = "출석 체크", description = "출석체크 수가 5의 배수면 월급을 받는 API 입니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = UserResponseDTO.updateAttendance.class))), diff --git a/src/main/java/com/finut/finut_server/domain/level/LevelRepository.java b/src/main/java/com/finut/finut_server/domain/level/LevelRepository.java index e8671ca..7053995 100644 --- a/src/main/java/com/finut/finut_server/domain/level/LevelRepository.java +++ b/src/main/java/com/finut/finut_server/domain/level/LevelRepository.java @@ -6,5 +6,5 @@ public interface LevelRepository extends JpaRepository { - Level findById(Long id); + Optional findById(Long id); } diff --git a/src/main/java/com/finut/finut_server/domain/user/Users.java b/src/main/java/com/finut/finut_server/domain/user/Users.java index 6f9edce..4271da5 100644 --- a/src/main/java/com/finut/finut_server/domain/user/Users.java +++ b/src/main/java/com/finut/finut_server/domain/user/Users.java @@ -52,6 +52,9 @@ public class Users extends BaseTimeEntity { @Column(nullable = false) private boolean todaySalary = false; + @Column(nullable = false) + private int continuousCount = 0; // 연속 출석 횟수 구하기 + @Column(nullable = false) private int diffQuizCount = 0; diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 597da2a..78d986e 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -11,15 +11,11 @@ import com.finut.finut_server.domain.user.UsersRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; import java.util.Optional; @Service @@ -63,37 +59,53 @@ public UserResponseDTO.updateAttendance updateAttendDate(Long userId){ attendRepository.save(attend); user.setTodaySalary(false); user.setAttendCount(user.getAttendCount() + 1); + + // 처음 출석하는 경우만 연속 출석 일자 체크하는 변수에 값 추가 + user.setContinuousCount(user.getContinuousCount() + 1); usersRepository.save(user); -// // 만약 연속 출석인 경우, XP 올리기 -// if(hasFiveConsecutiveDays(userId)){ -// user.setXP(user.getXP() + 5); -// } + // 만약 연속 출석 5회인 경우, XP 올리기 + 연속 출석 횟수 0으로 초기화 + if(user.getContinuousCount() == 5){ + user.setXP(user.getXP() + 5); + user.setContinuousCount(0); + msg = "연속 5회 출석했습니다!"; + } + + // XP가 100이면 승진하기 + if(user.getXP() >= 100){ + user.setXP(user.getXP() - 100); + Long newLevelId = user.getLevel().getId() + 1L; // id에 1 증가 -// // XP가 100이면 승진하기 -// if(user.getXP() == 100){ -// user.setLevel(user.getLevel()); -// } + // 증가된 id를 가진 Level 엔티티를 데이터베이스에서 조회하여 user에 설정 + Level newLevel = levelRepository.findById(newLevelId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 레벨입니다.")); + user.setLevel(newLevel); // user에 새로운 Level 설정 + msg = "승진했습니다!"; + } + + usersRepository.save(user); } else{ // 처음 출석하는 경우가 아니라면 - if(user.isTodaySalary()){ + if(user.isTodaySalary()) { // 오늘 이미 월급을 받았다면 msg = "오늘은 이미 월급을 받았습니다!"; } - else if(user.getAttendCount() == 5){ - // attendCount가 5가 되었다면 - user.setTodaySalary(true); - user.setAttendCount(0); - usersRepository.save(user); - - Level level = levelRepository.findById(user.getLevel().getId()); - user.setMoney(user.getMoney() + level.getSalary()); - msg = "월급을 받았습니다!"; - } else { user.setAttendCount(user.getAttendCount() + 1); usersRepository.save(user); + + if(user.getAttendCount() == 5){ + // attendCount가 5가 되었다면 + user.setTodaySalary(true); + user.setAttendCount(0); + usersRepository.save(user); + + Level level = levelRepository.findById(user.getLevel().getId()) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 레벨입니다."));; + user.setMoney(user.getMoney() + level.getSalary()); + msg = "월급을 받았습니다!"; + } } } @@ -104,33 +116,5 @@ else if(user.getAttendCount() == 5){ return updateAttendance; } - - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - - public boolean hasFiveConsecutiveDays(Long userId) { - LocalDate today = LocalDate.now(); - - // 오늘 날짜 포함하여 5일치 데이터 가져오기 - List dateStrings = attendRepository.findTop5ByUserIdAndDateBeforeOrderByDateDesc(userId, today); - - // 데이터가 부족한 경우 연속 5일이 아니므로 false - if (dateStrings.size() < 5) { - return false; - } - - // 날짜를 LocalDate 형식으로 변환하여 오름차순 정렬 - List dates = dateStrings.stream() - .map(date -> LocalDate.parse(date, FORMATTER)) - .sorted() - .toList(); - - // 연속적인 5일인지 확인 - for (int i = 1; i < dates.size(); i++) { - if (!dates.get(i).minusDays(1).equals(dates.get(i - 1))) { - return false; // 연속되지 않은 날짜가 있으면 false 반환 - } - } - return true; - } } From 8ffcaa95759f9f7c49c94f6eb3c6b9c391bcaebd Mon Sep 17 00:00:00 2001 From: plum-king Date: Tue, 5 Nov 2024 23:39:17 +0900 Subject: [PATCH 32/52] =?UTF-8?q?#25=20Update=20updateAttendDate=20:=20?= =?UTF-8?q?=EC=9B=94=EA=B8=89=20=EB=B0=9B=EC=9C=BC=EB=A9=B4=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EC=97=90=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/finut/finut_server/service/UsersService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 78d986e..9148b28 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -99,11 +99,12 @@ public UserResponseDTO.updateAttendance updateAttendDate(Long userId){ // attendCount가 5가 되었다면 user.setTodaySalary(true); user.setAttendCount(0); - usersRepository.save(user); Level level = levelRepository.findById(user.getLevel().getId()) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 레벨입니다."));; user.setMoney(user.getMoney() + level.getSalary()); + + usersRepository.save(user); msg = "월급을 받았습니다!"; } } From e0b4f30fbc4789fdaa49a4242d637f35fca4d906 Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 01:06:52 +0900 Subject: [PATCH 33/52] =?UTF-8?q?#35=20Update=20UserController=20:=20API?= =?UTF-8?q?=20Path=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/finut/finut_server/controller/UserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/UserController.java b/src/main/java/com/finut/finut_server/controller/UserController.java index 15ccacd..d0e0ee8 100644 --- a/src/main/java/com/finut/finut_server/controller/UserController.java +++ b/src/main/java/com/finut/finut_server/controller/UserController.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.*; @Tag(name = "User Controller", description = "사용자 관련 api") -@RequestMapping("/attend") +@RequestMapping("/user") @RestController public class UserController { @Autowired @@ -30,7 +30,7 @@ public class UserController { content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorReasonDTO.class))) }) - @PatchMapping("") + @PatchMapping("/attend") public ApiResponse updateAttendance(@RequestBody UserRequestDTO.checkAttendance request){ UserResponseDTO.updateAttendance updateAttendance = usersService.updateAttendDate(request.getUserId()); return ApiResponse.onSuccess(updateAttendance); From 2263863fd0926e57de9c3f7a6483306a2c31510e Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 01:40:36 +0900 Subject: [PATCH 34/52] =?UTF-8?q?#35=20Update=20UserController=20:=20Heade?= =?UTF-8?q?r=EC=97=90=EC=84=9C=20userId=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserController.java | 26 ++++++++++++++++--- .../domain/user/UserRequestDTO.java | 17 ------------ 2 files changed, 23 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java diff --git a/src/main/java/com/finut/finut_server/controller/UserController.java b/src/main/java/com/finut/finut_server/controller/UserController.java index d0e0ee8..15d612a 100644 --- a/src/main/java/com/finut/finut_server/controller/UserController.java +++ b/src/main/java/com/finut/finut_server/controller/UserController.java @@ -2,14 +2,16 @@ import com.finut.finut_server.apiPayload.ApiResponse; import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; -import com.finut.finut_server.domain.user.UserRequestDTO; import com.finut.finut_server.domain.user.UserResponseDTO; +import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.service.UsersService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -31,8 +33,26 @@ public class UserController { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @PatchMapping("/attend") - public ApiResponse updateAttendance(@RequestBody UserRequestDTO.checkAttendance request){ - UserResponseDTO.updateAttendance updateAttendance = usersService.updateAttendDate(request.getUserId()); + public ApiResponse updateAttendance(HttpServletRequest request, HttpServletResponse response){ + Users user = usersService.getUserIdByToken(request, response); + UserResponseDTO.updateAttendance updateAttendance = usersService.updateAttendDate(user.getId()); return ApiResponse.onSuccess(updateAttendance); } + + @Operation(summary = "프로필 확인", description = "사용자가 본인의 정보를 확인하는 API 입니다.") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = UserResponseDTO.viewUserInfo.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "사용자 정보를 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/profile") + public ApiResponse viewUserInfo(HttpServletRequest request, HttpServletResponse response){ + Users user = usersService.getUserIdByToken(request, response); + UserResponseDTO.viewUserInfo viewUserInfo = usersService.viewUserInfo(user.getId()); + return ApiResponse.onSuccess(viewUserInfo); + } } diff --git a/src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java b/src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java deleted file mode 100644 index d10422c..0000000 --- a/src/main/java/com/finut/finut_server/domain/user/UserRequestDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.finut.finut_server.domain.user; - -import jakarta.validation.constraints.NotNull; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -public class UserRequestDTO { - @Getter - public static class checkAttendance { - @NotNull - Long userId; // 접속한 유저의 아이디 - } -} From 53a5939fadc82a8731749c1e037fcbf376134c1e Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 02:01:21 +0900 Subject: [PATCH 35/52] =?UTF-8?q?#35=20Update=20level.sql=20:=20level=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=EB=82=B4=20level=5Fname=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- level.sql | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/level.sql b/level.sql index 24b11cf..3f13f45 100644 --- a/level.sql +++ b/level.sql @@ -1,7 +1,13 @@ -insert into finut.level(id, level, level_quiz_cnt, salary) values (1, 0, 5, 400000); -insert into finut.level(id, level, level_quiz_cnt, salary) values (2, 1, 5, 1000000); -insert into finut.level(id, level, level_quiz_cnt, salary) values (3, 2, 5, 2000000); -insert into finut.level(id, level, level_quiz_cnt, salary) values (4, 3, 5, 4000000); -insert into finut.level(id, level, level_quiz_cnt, salary) values (5, 4, 5, 6000000); -insert into finut.level(id, level, level_quiz_cnt, salary) values (6, 5, 5, 8000000); -insert into finut.level(id, level, level_quiz_cnt, salary) values (7, 6, 5, 10000000); \ No newline at end of file +/* +-- Query: SELECT * FROM finut.level +LIMIT 0, 5000 + +-- Date: 2024-11-06 01:59 +*/ +INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (1,NULL,NULL,5,400000,'PARTTIMEJOB'); +INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (2,NULL,NULL,5,1000000,'INTERN'); +INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (3,NULL,NULL,5,2000000,'STAFF'); +INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (4,NULL,NULL,5,4000000,'ASSOCIATEMANAGER'); +INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (5,NULL,NULL,5,6000000,'MANAGER'); +INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (6,NULL,NULL,5,8000000,'SENIORMANAGER'); +INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (7,NULL,NULL,5,10000000,'DIRECTOR'); \ No newline at end of file From 27460a0b3586594d557aa21070396319d80c9e01 Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 12:48:07 +0900 Subject: [PATCH 36/52] =?UTF-8?q?#35=20Update=20UsersService=20:=20googleA?= =?UTF-8?q?uthService=20Autowired=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A1=B0=ED=9A=8C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/service/UsersService.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 655c699..2f5c0bb 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -11,7 +11,6 @@ import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.domain.user.UsersRepository; import com.google.api.services.oauth2.model.Userinfoplus; -import jakarta.servlet.FilterChain; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -21,6 +20,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.Optional; @Service @RequiredArgsConstructor @@ -35,7 +35,8 @@ public class UsersService { @Autowired private LevelRepository levelRepository; - GoogleAuthService googleAuthService; + @Autowired + private GoogleAuthService googleAuthService; public void saveRefreshToken(String email, String refreshToken) { Optional optionalUser = usersRepository.findByEmail(email); @@ -124,6 +125,21 @@ public UserResponseDTO.updateAttendance updateAttendDate(Long userId){ return updateAttendance; } + public UserResponseDTO.viewUserInfo viewUserInfo(Long userId) { + Users user = usersRepository.findById(userId) + .orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND)); + UserResponseDTO.viewUserInfo viewUserInfo = UserResponseDTO.viewUserInfo.builder() + .userId(userId) + .name(user.getName()) + .money(user.getMoney()) + .picture(user.getPicture()) + .xp(user.getXP()) + .levelName(user.getLevel().getLevelName().getKoreanName()) + .build(); + + return viewUserInfo; + } + public Users getUserIdByEmail(String email) { return usersRepository.findByEmail(email) .orElseThrow(() -> new RuntimeException("User not found with email: " + email)); From aad8e7e4c299498e3697beda508ea149bc8432a2 Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 12:48:53 +0900 Subject: [PATCH 37/52] =?UTF-8?q?#35=20Update=20UserResponseDTO=20:=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=ED=95=A0=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=9D=91=EB=8B=B5=20DTO=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/domain/user/UserResponseDTO.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java index 3f93560..b81afc0 100644 --- a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java +++ b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java @@ -22,4 +22,17 @@ public static class updateAttendance { Long userId; String message; } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class viewUserInfo { + Long userId; + String name; + Long money; + String picture; + int xp; + String levelName; + } } From f95042cf571bfb0e1d8d5d9a9bcd33f610851614 Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 12:49:41 +0900 Subject: [PATCH 38/52] =?UTF-8?q?#35=20Update=20Level=20:=20levelKoreanNam?= =?UTF-8?q?e=20=EC=A1=B0=ED=9A=8C=20=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/domain/level/Level.java | 3 ++- .../finut_server/domain/level/LevelName.java | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/finut/finut_server/domain/level/Level.java b/src/main/java/com/finut/finut_server/domain/level/Level.java index b6c73be..a9a770f 100644 --- a/src/main/java/com/finut/finut_server/domain/level/Level.java +++ b/src/main/java/com/finut/finut_server/domain/level/Level.java @@ -18,7 +18,8 @@ public class Level extends BaseTimeEntity { private Long id; @Column(nullable = false) - private LevelName level; // 직급 + @Enumerated(EnumType.STRING) + private LevelName levelName; // 직급 @Column(nullable = false) private int salary; // 월급 액수 diff --git a/src/main/java/com/finut/finut_server/domain/level/LevelName.java b/src/main/java/com/finut/finut_server/domain/level/LevelName.java index 0ceacbb..6a44263 100644 --- a/src/main/java/com/finut/finut_server/domain/level/LevelName.java +++ b/src/main/java/com/finut/finut_server/domain/level/LevelName.java @@ -1,11 +1,21 @@ package com.finut.finut_server.domain.level; public enum LevelName { - PARTTIMEJOB, - INTERN, - STAFF, - ASSOCIATEMANAGER, - MANAGER, - SENIORMANAGER, - DIRECTOR + PARTTIMEJOB("아르바이트"), + INTERN("인턴"), + STAFF("사원"), + ASSOCIATEMANAGER("대리"), + MANAGER("과장"), + SENIORMANAGER("차장"), + DIRECTOR("부장"); + + private final String koreanName; + + LevelName(String koreanName) { + this.koreanName = koreanName; + } + + public String getKoreanName() { + return koreanName; + } } From e4997f6b6af3ed5560a27663099ae1121bf8b650 Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 23:52:10 +0900 Subject: [PATCH 39/52] =?UTF-8?q?#37=20Refactor=20TodayNewsController=20:?= =?UTF-8?q?=20=EC=9D=91=EB=8B=B5=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TodayNewsController.java | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java index 1a991a1..d3131e4 100644 --- a/src/main/java/com/finut/finut_server/controller/TodayNewsController.java +++ b/src/main/java/com/finut/finut_server/controller/TodayNewsController.java @@ -1,10 +1,12 @@ package com.finut.finut_server.controller; +import com.finut.finut_server.apiPayload.ApiResponse; import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.news.NewsItemDTO; import com.finut.finut_server.service.TodayNewsService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -28,7 +30,7 @@ public class TodayNewsController { @Operation(summary = "오늘의 뉴스 - 경제", description = "오늘의 뉴스 중 경제 부분의 뉴스들을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = String.class))), + array = @ArraySchema(schema = @Schema(implementation = NewsItemDTO.class)))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -36,9 +38,9 @@ public class TodayNewsController { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/economy") - public List newsEconomy() { + public ApiResponse> newsEconomy() { try { - return todayNewsService.getNews(1); // economy + return ApiResponse.onSuccess(todayNewsService.getNews(1)); // economy } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Fail to fetch RSS Economy", e); @@ -48,7 +50,7 @@ public List newsEconomy() { @Operation(summary = "오늘의 뉴스 - 부동산", description = "오늘의 뉴스 중 부동산 부분의 뉴스들을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = String.class))), + array = @ArraySchema(schema = @Schema(implementation = NewsItemDTO.class)))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -56,9 +58,9 @@ public List newsEconomy() { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/realestate") - public List newsRealEstate() { + public ApiResponse> newsRealEstate() { try { - return todayNewsService.getNews(2); // real estate + return ApiResponse.onSuccess(todayNewsService.getNews(2)); // real estate } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Fail to fetch RSS Economy", e); @@ -68,7 +70,7 @@ public List newsRealEstate() { @Operation(summary = "오늘의 뉴스 - 증권", description = "오늘의 뉴스 중 증권 부분의 뉴스들을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = String.class))), + array = @ArraySchema(schema = @Schema(implementation = NewsItemDTO.class)))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -76,9 +78,9 @@ public List newsRealEstate() { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/stock") - public List newsStock() { + public ApiResponse> newsStock() { try { - return todayNewsService.getNews(3); // stock + return ApiResponse.onSuccess(todayNewsService.getNews(3)); // stock } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Fail to fetch RSS Economy", e); @@ -88,7 +90,7 @@ public List newsStock() { @Operation(summary = "뉴스 본문 - 증권", description = "{number} 증권 뉴스의 본문을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = String.class))), + schema = @Schema(implementation = Map.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -96,20 +98,20 @@ public List newsStock() { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/stock/{number}") - public Map getStockContent(@PathVariable Long number) { + public ApiResponse> getStockContent(@PathVariable Long number) { String url = "https://m.mk.co.kr/news/stock/" + number; String content = TodayNewsService.getMainContent(url); Map response = new HashMap<>(); response.put("content", content); - return response; + return ApiResponse.onSuccess(response); } @Operation(summary = "뉴스 본문 - 경제", description = "{number} 경제 뉴스의 본문을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = String.class))), + schema = @Schema(implementation = Map.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -117,20 +119,20 @@ public Map getStockContent(@PathVariable Long number) { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/economy/{number}") - public Map getEconomyContent(@PathVariable Long number) { + public ApiResponse> getEconomyContent(@PathVariable Long number) { String url = "https://m.mk.co.kr/news/economy/" + number; String content = TodayNewsService.getMainContent(url); Map response = new HashMap<>(); response.put("content", content); - return response; + return ApiResponse.onSuccess(response); } @Operation(summary = "뉴스 본문 - 부동산", description = "{number} 부동산 뉴스의 본문을 보여줍니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = String.class))), + schema = @Schema(implementation = Map.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "뉴스 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -138,14 +140,14 @@ public Map getEconomyContent(@PathVariable Long number) { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/realestate/{number}") - public Map getContent(@PathVariable Long number) { + public ApiResponse> getContent(@PathVariable Long number) { String url = "https://m.mk.co.kr/news/realestate/" + number; String content = TodayNewsService.getMainContent(url); Map response = new HashMap<>(); response.put("content", content); - return response; + return ApiResponse.onSuccess(response); } -} +} \ No newline at end of file From 9a0313bba6e23b936189267279520d886ad766d3 Mon Sep 17 00:00:00 2001 From: plum-king Date: Wed, 6 Nov 2024 23:52:57 +0900 Subject: [PATCH 40/52] =?UTF-8?q?#37=20Refactor=20QuizController=20:=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/finut/finut_server/controller/QuizController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 13ece50..db32133 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -52,7 +52,7 @@ public QuizController(GoogleAuthService googleAuthService, UsersService usersSer @Operation(summary = "랜덤으로 퀴즈 내용 불러오기", description = "유저가 풀지 않았던 문제 중에서 퀴즈를 랜덤으로 하나 가져옵니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.randomQuizResponseDTO.class))), + schema = @Schema(implementation = Quiz.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -73,7 +73,7 @@ public ApiResponse> getQuiz(HttpServletRequest request, HttpServl @Operation(summary = "퀴즈를 맞췄을 때", description = "퀴즈를 맞췄을 때 QuizDone DB에 해당 내용을 저장하고, 난이도 상승에 필요한 퀴즈 개수와 레벨업에 필요한 퀴즈 개수를 증가시킵니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.randomQuizResponseDTO.class))), + schema = @Schema(implementation = String.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -102,7 +102,7 @@ public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletReq @Operation(summary = "퀴즈를 틀렸을 때", description = "퀴즈를 틀렸을 때, 틀렸다는 정보를 저장합니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = QuizResponseDTO.randomQuizResponseDTO.class))), + schema = @Schema(implementation = String.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -123,4 +123,4 @@ public ApiResponse quizWrong(@PathVariable Long quizId, HttpServletReque } } -} +} \ No newline at end of file From eeba0c795b93eafd0793007157971f14d84e3fd3 Mon Sep 17 00:00:00 2001 From: plum-king Date: Thu, 7 Nov 2024 00:15:59 +0900 Subject: [PATCH 41/52] =?UTF-8?q?#37=20Fix=20User,=20Difficulty=20:=20OneT?= =?UTF-8?q?oOne=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=B4=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=ED=95=9C=20Duplicate=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/difficulty/Difficulty.java | 6 +++--- .../com/finut/finut_server/domain/user/Users.java | 15 ++++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java index 6f293b0..b87d9dd 100644 --- a/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java +++ b/src/main/java/com/finut/finut_server/domain/difficulty/Difficulty.java @@ -7,6 +7,7 @@ @Entity @Getter +@Setter @Table(name = "Difficulty") public class Difficulty { @@ -16,7 +17,6 @@ public class Difficulty { @Column(nullable = false) private int diffQuizCnt; - - @OneToOne(mappedBy = "difficulty") - private Users user; +// @OneToOne(mappedBy = "difficulty") +// private Users user; } diff --git a/src/main/java/com/finut/finut_server/domain/user/Users.java b/src/main/java/com/finut/finut_server/domain/user/Users.java index dddfb87..85f5f76 100644 --- a/src/main/java/com/finut/finut_server/domain/user/Users.java +++ b/src/main/java/com/finut/finut_server/domain/user/Users.java @@ -3,11 +3,13 @@ import com.finut.finut_server.domain.BaseTimeEntity; import com.finut.finut_server.domain.difficulty.Difficulty; +import com.finut.finut_server.domain.difficulty.DifficultyType; import com.finut.finut_server.domain.quizDone.QuizDone; import com.finut.finut_server.domain.level.Level; import com.finut.finut_server.domain.level.LevelName; import jakarta.persistence.*; import lombok.*; +import org.hibernate.mapping.ToOne; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -42,7 +44,7 @@ public class Users extends BaseTimeEntity { @Column(nullable = false) private Long money = 100000L; - @OneToOne + @ManyToOne @JoinColumn(name = "levelId", referencedColumnName = "id") private Level level; @@ -64,9 +66,7 @@ public class Users extends BaseTimeEntity { @Column(nullable = false) private int levelQuizCount = 0; - - - @OneToOne + @ManyToOne @JoinColumn(name = "difficulty") private Difficulty difficulty; @@ -106,5 +106,10 @@ public void prePersist() { this.level = new Level(); // 또는 LevelRepository를 사용해 ID가 1인 Level을 설정 this.level.setId(1L); // 기본값으로 ID가 1인 Level 설정 } + + if (this.difficulty == null) { + this.difficulty = new Difficulty(); + this.difficulty.setDifficulty(DifficultyType.LO); + } } -} +} \ No newline at end of file From cdf9627a499a6a05d4a2234e8472e662b0a81d70 Mon Sep 17 00:00:00 2001 From: yeojin Date: Thu, 7 Nov 2024 12:32:50 +0900 Subject: [PATCH 42/52] =?UTF-8?q?Update=20.sql:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20sql=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- level.sql | 13 - quiz.sql | 584 ------------------ .../finut_server/service/UsersService.java | 1 + src/main/resources/difficulty.sql | 3 + src/main/resources/level.sql | 13 + src/main/resources/quiz.sql | 44 ++ .../controller/QuizControllerTest.java | 78 ++- 7 files changed, 138 insertions(+), 598 deletions(-) delete mode 100644 level.sql delete mode 100644 quiz.sql create mode 100644 src/main/resources/difficulty.sql create mode 100644 src/main/resources/level.sql create mode 100644 src/main/resources/quiz.sql diff --git a/level.sql b/level.sql deleted file mode 100644 index 3f13f45..0000000 --- a/level.sql +++ /dev/null @@ -1,13 +0,0 @@ -/* --- Query: SELECT * FROM finut.level -LIMIT 0, 5000 - --- Date: 2024-11-06 01:59 -*/ -INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (1,NULL,NULL,5,400000,'PARTTIMEJOB'); -INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (2,NULL,NULL,5,1000000,'INTERN'); -INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (3,NULL,NULL,5,2000000,'STAFF'); -INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (4,NULL,NULL,5,4000000,'ASSOCIATEMANAGER'); -INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (5,NULL,NULL,5,6000000,'MANAGER'); -INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (6,NULL,NULL,5,8000000,'SENIORMANAGER'); -INSERT INTO `` (`id`,`created_date`,`modified_date`,`level_quiz_cnt`,`salary`,`level_name`) VALUES (7,NULL,NULL,5,10000000,'DIRECTOR'); \ No newline at end of file diff --git a/quiz.sql b/quiz.sql deleted file mode 100644 index 152f66c..0000000 --- a/quiz.sql +++ /dev/null @@ -1,584 +0,0 @@ -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (1, "1금융권은 정부에서 만들어진 ‘상호신용금고법’으로부터 나타난 금융회사가 아니라는 것이다.", "TRUE", "FALSE", "", "TRUE", "은행 외에는 고금리의 사금융밖에 선택지가 없던 1970 년대, 정부에서 ‘상호신용금고법’을 만들어 사금융을 양성화하기 시작했습니다. 이때부터 나타난 회사들은 특정 그룹이나 분야에 전문성을 가진 회사였습니다. 이렇게 새로운 금융회사들이 만들어지던 시기에, 은행과 은행이 아닌 금융회사를 구별해서 부르기 시작했습니다. 예전부터 있었던 은행을 1 금융권으로, ‘은행이 아닌’ 금융회사를 2금융권으로 부르게 된 거죠. 1금융권인 은행과 2금융권에 속해있는 저축은행의 경우, 예금과 대출을 해준다는 측면에서 비슷한 기능을 하기 때문에 소비자 입장에서는 같은 선상에 두고 비교해볼 만합니다.안정성이 높지만 수익률(이자율)이 낮은 1금융권 예금을 택할지, 대출금리가 높지만 대출받기가 더 쉬운 2금융권 대출을 택할지 비교해보는 거예요.", -"TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (2, "2차전지는 충전과 방전을 통해 사용이 가능한 전지가 아니에요.", "TRUE", "FALSE", "", "FALSE", "2차전지는 충전과 방전을 통해 여러 번 사용이 가능한 전지예요. 대표적인 2 차전지로는 휴대폰 배터리가 있습니다. 종류는 납 축전지, 니켈카드뮴 전지, 니켈수소 전지, 리튬이온 전지 등이 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (3, "52주 신고가는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가입니다.", "TRUE", "FALSE", "", "TRUE", "52주 신고가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 높은 -주가를 말해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (4, "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말합니다.", -"TRUE", "FALSE", "", "TRUE", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (5, "bp(베이시스포인트)는 0.01%p의 움직임도 금융시장에 큰 영향을 미칩니다.", "TRUE", "FALSE", "", "TRUE", "기준금리 뉴스에 자주 등장하는 ‘bp’는 ‘basis point’의 약자예요. 금융에서 쓰이는 기본단위로, 금리나 수익률, 환율을 나타낼 때 사용합니다. 일반적으로 사용하는 백분율이 아닌 ‘만분율’ 단위의 움직임을 표현하는데요. 1bp는 0.01%p, 10bp는 0.1%p, 100bp는 1%p예요. 금융시장에서는 0.01%p의 움직임도 영향력이 커요. 그래서 0.01%p도 뉴스에 자주 언급됩니다. 백분율을 기준으로 ‘퍼센트포인트’라고 말하는 것보다 만분율을 기준으로 bp로 나타내는 것이 정보전달에 더 효율적이라서 사용한다는 얘기가 있어요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (6, "DSR은 내 소득 대비 금융부채 원리금 상환비율로, 40%를 넘는 경우에는 대출을 해주지 않는다.", "TRUE", "FALSE", "", "TRUE", "DSR(Debt Service Ratio)은 내 소득 대비 금융부채 원리금 상환비율이에요. DSR 40%라면 내 연 소득이 1억 원일 때, 1년 동안의 원금과 이자 상환비율이 4천만 원을 넘지 않는 정도까지 대출을 해준다는 뜻이에요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (7, "DTI(총부채상환비율)는 연 소득 대비 금융비용 부담률을 나타내는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. DTI는 ‘나의 연소 득’에서 ‘주택담보대출의 원금 상환과 이자, 다른 대출의 이자로 나가는 금액’이 차지하는 비중으로 구합니다. 내가 가진 모든 대출의 원리금 상환금액을 합쳐 따지는 DSR보다는 유한 기준입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (8, "ESG는 환경, 사회, CORPORATE GOVERNANCE에 대한 고려를 의미합니다.", "TRUE", "FALSE", "", "TRUE", "ESG는 Environmental(환경), Social(사회), Governance(지배구조)의 첫 글자를 조합한 단어로 기업의 친환경 경영, 사회적 책임, 투명한 지배구조 등을 의미합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) - -values (9, "ETF는 특정 주식에 대한 투자 상품이 아니다.", "TRUE", "FALSE", "", "TRUE", "ETF(Exchange Traded Fund)는 말 그대로 인덱스펀드를 거래소에 상장시켜 투자자들이 주식처럼 편리하게 거래할 수 있도록 만든 상품입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (10, "G7은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최하는 7개국을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "G7. Group of Seven Summit. 주요 7개국 정상회담의 약자입니다. 미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본 7개국은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최해요. 이 회담뿐만 아니라 이 회담에 참여하는 7개국을 G7이라고 줄여 부르기도 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (11, "GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 것이다.", "TRUE", "FALSE", "", "TRUE", "GNI는 Gross National Income의 약자로, ‘ 국민총소득’입니다. GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 거예요. 우리나라에 거주하고 있는 외국인의 소득은 제외하고, 외국에 거주하는 우리나라 국민의 소득을 포함해요. GNI를 구하는 가장 큰 이유는 국가가 아니라 국민들의 생활 수준을 알아보기 위해서예요. GNI와 유사한 지표로는 GDP가 있어요. GDP는 ‘한 국가에서 생산된 모든 부가가치의 총합’으로 국가 경제의 규모를 나타내죠. 위의 그림으로 이해하자면 사과는 부가가치, 사과박스는 국가의 영토, 과수원은 부가가치를 창출하는 국민ᆞ회사를 뜻해요. A국적을 가진 국민ᆞ회사(과수원)가 전 세계에서 부가가치(사과)를 창출하는 상황을 가정해볼게요. GDP는 사과 박스에 사과가 얼마나 들었는지를 보는 것과 비슷합니다. 사과가 많이 든 박스가 경제력이 큰 국가라고 볼 수 있고요. GNI는 과수원에서 나오는 사과들의 총합이라고 볼 수 있어요. 생산량이 많은 과수원이 GNI가 큰 국가예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (12, "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 방식으로 진행되는 것이다.", "TRUE", "FALSE", "", "TRUE", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 비율을 말해요. 이 수치가 -높은 나라일수록 전 세계 자원이 거쳐가는 글로벌 생산기지라 할 수 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (13, "LTV는 주택담보대출의 대출가능금액을 산출할 때 사용되는 공식입니다.", "TRUE", "FALSE", "", "TRUE", "LTV는 주택담보대출비율(Loan to Value ratio)입니다. 공식은 ‘(대출한 금액) / (아파트 가치)*100’이에요. 즉, 총 아파트 가치에 비교한 대출금의 비중을 보여줘요. LTV는 주택담보대출의 대출가능금액을 산출할 때 사용돼요. LTV 기준비율은 지역에 따라 다른데요. 평균 40~70% 수준입니다. DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. LTV로는 대출받을 수 있는 최대금액을 계산하면 되고, DTI로는 대출 받고자 하는 금액이 소득 수준과 비교해서 적합한지 확인할 수 있습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (14, "M&A(인수합병)는 기업이 다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념입니다.", "TRUE", "FALSE", "", "TRUE", "기업이 -다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념이에요. M&A는 ‘Merger(합병)&Accquisition(인수)’의 약자로, 인수&합병 순서가 반대예요. 인수와 합병 안에서도 어디까지 인수하고, 어떻게 합병하느냐에 따라 세부적인 종류가 나뉩니다. 기본적인 목적은 회사 규모를 키우거나 시장에서 빠르게 경쟁력을 키우는 것이에요. 예를 들어 더 작은 회사의 기술이 지속적으로 필요할 때, 비슷한 업계에서 비슷한 일을 하고 있는 몇 개의 회사가 합쳐져 큰 회사가 되려고 할 때 M&A를 할 수 있습니다. 이 과정이 기존 경영진이나 기존 주주들의 합의에 의해 이뤄지면 우호적 M&A, 기존 경영진이나 주주의 의사와는 관계없이 경영 환경 등에 의해 이뤄지면 적대적 M&A라고 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (15, "PMI ‘ISM 제조업 구매관리자지수’는 생산 관련 지수가 아니고, 경제동향지표입니다.", "TRUE", "FALSE", "", "TRUE", "‘ISM 제조업 구매관리자지수(The ISM manufacturing Index)’ 는 생산 관련 지수예요. ‘PMI 지수’라고도 불러요. PMI 지수는 미국의 민간 경제단체인 공급관리협회 (The Institute of Supply Management)에서 매달 19종 400개 이상의 전·후방 제조업 - -구매담당자에게 설문을 돌려 만드는 경기동향지표입니다. 제조업 실무자에게 재고 수준이나 신규 주문량, 고용 상황 등은 어떻게 되어가고 있는지 등 현재 업황을 물어보기 때문에 업계 전망을 직접적으로 -파악할 수 있어요. 우리나라로 치면 한국은행이 조사하는 ‘기업경기실사지수(BSI)’와 비슷해요. PMI 지수는 매월 첫 영업일에 발표됩니다. 다른 거시경제 지표보다 일찍 발표되면서도 이후 발표될 거시경제 지표와 큰 차이가 날 리는 없으니, 이번 달 경기 움직임을 미리 보여주는 지표라고 할 수 있어요. PMI 지수는 0부터 100 사이에서 수치가 결정됩니다. 50을 기준으로 해서 50보다 낮으면 제조업경기가 전보다 수축되었다고 볼 수 있고, 50보다 높으면 제조업경기가 전보다 확장되어 간다고 해석해요. 절대적으로 좋다, 나쁘다라고 해석하기보다는 ‘전월 대비 이번 달은 어떤지’에 대한 추세가 중요한 지표입니다. 만약 PMI 지수가 좋게 나오면 미국 증시뿐만 아니라 우리나라 증시도 분위기가 좋아질 수 있습니다. 미국의 제조업 업황이 좋으면 우리나라의 수출도 늘어나기 때문이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (16, "가처분소득은 내가 번 소득에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다.", "TRUE", "FALSE", "", "TRUE", "가처분소득은 내가 번 소득 중 소비와 저축으로 쓸 수 있는 돈을 뜻해요. 구체적으로는 내가 번 돈에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다. 소득 분위에 따라 실제로 사람들의 소득수준이 어떤지 볼 수 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (17, "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다.", "TRUE", "FALSE", "", "TRUE", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다. 감사보고서 의견은 ‘적정’, ‘부적정’, ‘한정’, ‘의견거절’ 총 네 가지예요. 이 중 ‘적정’을 제외한 ‘부적정’, ‘한정’, ‘의견거절’은 ‘비적정’에 해당돼요. 코스닥 상장기업이 ‘비적정(부적정, 한정, 의견거절)’ 의견을 받으면 바로 상장폐지 사유가 발생합니다. 코스피 상장사의 경우 ‘부적정’ 또는 ‘의견거절’을 받거나 ‘한정’을 2년 연속 받으면 상장폐지 사유가 발생합니다. 감사보고서 제출 기한을 앞두고 기업도, -주주도 예민해지곤 합니다. 상장폐지 사유가 발생하면, 그 사유가 해소될 때까지 주식 거래가 정지되거든요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (18, "개인소비지출(PCE)은 개인이 소유한 재산을 사용하여 구입하는 모든 물품과 서비스를 의미합니다.", "TRUE", "FALSE", "", "TRUE", "개인소비지출(Personal Consumption Expenditures, PCE)은 가계가 재화와 서비스를 구매하는 데 사용하는 지출을 의미합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (19, "거래대금은 주식이 사고 팔린 총 금액으로, 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "거래대금은 주식이 사고 팔린 총 금액입니다. 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다. 거래대금이 크다는 것은 그만큼 거래량이 많다는 뜻이에요. 거래량과 거래대금은 주가지수와 함께 주식시장의 경기를 판단하는 중요한 자료로 활용되고 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (20, "경기순환사이클은 상승과 하락을 반복하는 현상을 의미하며, 크게 회복기-활황기- 후퇴기-침체기가 있다.", "TRUE", "FALSE", "", "TRUE", "경기가 일정 주기를 두고 상승과 하락을 반복하는 현상을 경기순환이라고 합니다. 크게, 회복기-활황기-후퇴기-침체기가 돌고 돌아요. 경기순환의 전반적인 흐름을 파악하면 투자 전략을 짜는 데 도움이 될 수 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (21, "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동·자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부입니다.", "TRUE", "FALSE", "", "TRUE", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동· 자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부라고 할 수 있어요. 경상수지는 ‘국제수지’라는 지표의 일부분입니다. 국제수지는 우리나라가 다른 국가들과 서로 거래한 내역을 기록한 회계장부라고 생각하시면 돼요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) - -values (22, "경착륙은 호황이 끝나고 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다.", "TRUE", "FALSE", "", "TRUE", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 주식, 부동산 -등 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 자본주의 경제 시스템에서는 호황과 불황이 주기적으로 찾아옵니다. 불황이 왔을 때 부작용을 최소화하며 경기 침체에 대응한다면 연착륙이라고 하고, 대응에 실패해 우당탕 급락과 폭락을 하게 된다면 경착륙이라고 해요. 경착륙은 원래 항공용어로, 비행기 구조가 손상될 정도로 거칠게 착륙하는 행위를 말해요. 연착륙은 서서히 속도를 조절해가며 활주로에 기체가 부드럽게 내려앉는 것입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (23, "공개매수가 특히 적대적 M&A의 방법으로 자주 활용되는 이유는?", "TRUE", -"FALSE", "", "TRUE", "공개적으로 주식을 사들인다는 뜻이에요. 공개매수는 특히 적대적 M&A( 인수합병)의 방법으로 자주 활용됩니다. 회사의 대주주가 지분을 넘기려고 하지 않을 때, 그 회사를 인수하려는 곳에서 다른 주주의 지분을 공개매수를 통해 사들이는 방식이죠. 그렇게 해서 얻은 지분이 기존 대주주보다 많다면 사실상 회사의 경영권을 손에 얻게 되니까요. 공개매수는 일정 기간을 잡아놓고, -그 기간 안에 시장 밖에서 주식을 사는 방식으로 이루어집니다. 이때, 시장에서 거래되는 주식 가격보다 높은 가격을 불러요. 기존 주주는 물론, 지분을 더 확보하려는 대주주가 주식을 더 사도록 만들기도 해서, 공개매수 공시가 나오면 주가가 상승하는 모습을 보이곤 합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (24, "공제는 특정 금액을 덜어준다.", "TRUE", "FALSE", "", "TRUE", "공제(控除). 당길(공), 덜다(제). 사전적 의미로는 ‘뺀다’라는 뜻입니다. 세금 얘기할 때 등장하면 ‘특정 금액을 덜어준다’라고 해석하면 돼요. 회사에서 급여를 줄 때, 4대보험과 소득세를 공제한 금액을 입금합니다. 직원의 4대보험료와 소득세를 나라에 대신 내주거든요. 이렇게 세금을 걷는 방식을 원천징수라고 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (25, "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태는 관치금융입니다.", "TRUE", "FALSE", "", "TRUE", "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태예요. 금융이 법이나 시장 원리보다는 정책에 영향을 받아 움직이게 됩니다. 관치금융은 우리나라 금융시장의 특징이기도 합니다. 1990년대 이전 고도성장기에는 금융이 ‘국민 경제 성장’이라는 정치적인 목적을 위해 움직였어요. 당시 수출대기업에 금융지원을 몰아주는 정책은 강력한 성장 엔진이 되기도 했어요. 지금의 관치금융은 ‘금융만은 국가가 안전하게 보호해야 한다’와 ‘정부의 관리가 금융권의 자생력과 혁신을 가로막고 있다’는 이야기를 동시에 듣고 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (26, "국내총생산(GDP)은 경제 활동의 총 가치를 나타내는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "한 나라의 영역 내에서 가계, 기업, 정부 등 모든 경제주체가 일정기간 -동안 생산한 재화 및 서비스의 부가가치1)를 시장가격으로 평가하여 합산한 것으로 여기에는 -비거주자가 제공한 노동, 자본 등 생산요소에 의하여 창출된 것도 포함되어 있습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (27, "기업이 생산량을 늘리면서 제품 하나를 만드는 데 드는 단위당 생산 비용이 하락하는 것은 규모의 경제입니다.", "TRUE", "FALSE", "", "TRUE", "규모의 경제는 기업이 생산량을 늘리면서 제품 하나를 만드는 데 드는 단위당 생산 비용이 하락하는 현상이에요. 1천만 원을 들여 마스크 공장을 세웠을 때, 마스크를 딱 하나만 찍어내면 마스크 하나를 찍어내는 데 드는 비용은 1천만 원이에요. 하지만 고객의 주문이 늘어나 마스크를 1천 개 찍어내면 마스크 한 개당 생산 비용은 1만 원이 됩니다. 이렇게 고정비용이 줄어드는 규모의 경제가 실현되면 장기적으로 생산 비용이 줄어들어서 수익이 증가하게 돼요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (28, "규제 샌드박스는 업계에서 새로운 금융 서비스나 제품을 시험 배포하기 위해 일정 기간 동안 규제를 완화하는 제도를 말해요.", "TRUE", "FALSE", "", "TRUE", "규제 샌드박스는 새로운 제품이나 서비스를 출시할 때 일정 기간 규제를 면제하거나 유예하는 제도예요. 혁신적인 서비스를 개발할 수 있다면 일단 제약 없이 해보라는 거예요. 샌드박스라는 의미는 모래놀이터(Sandbox)에서 유래되었어요. 모래놀이터에서 아이들이 덜 다치고 안전하게 노는 것 처럼 규제 샌드박스에서는 마음껏 - -아이디어를 펼쳐보라는 의미죠.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (29, "그린워싱은 기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 표방하는 것처럼 홍보하는 것을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "그린 워싱은 ‘Green’과 ‘White Washing’을 합친 말로, 기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 -표방하는 것처럼 홍보하는 걸 의미합니다. 한마디로 친환경인 것처럼 세탁한다는 뜻이에요. 매출, 영업이익과 같은 재무정보와 달리, ESG 등 비재무정보는 평가 기준을 마련하기가 쉽지 않은데요. -빈틈을 이용해 ‘마치 ESG 성과를 잘 내는 것처럼’ 보이도록 그린 워싱을 하는 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (30, "근원소비자물가지수는 소비자들이 실제로 구매하는 물건의 가격을 측정합니다.", "TRUE", "FALSE", "", "TRUE", "소비자물가를 포함한 물가지수에는 ‘명목지수’와 ‘근원지수’ 두 종류가 있습니다. 소비자물가 명목지수는 흔히 ‘소비자물가지수’라고 불려요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (31, "금리인하요구권은 저축자 또는 채무자가 금리를 낮출 수 있도록 요구하는 권리가 있는 경우를 말합니다.", "TRUE", "FALSE", "", "TRUE", "금리인하요구권은 말 그대로 ‘(대출)금리를 내려달라고 요구할 수 있는 권한’이에요.\n신용상태나 상환능력이 대출 당시보다 크게 좋아졌을 때 금리인하요구권을 행사해 대출금리를 낮출 수 있습니다. 구체적인 사유로는 신용등급 상승, 취업, 이직, -승진하거나 전문직 자격증을 땄을 때, 자산이 늘고 부채가 줄었을 때 등이 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (32, "금산분리는 금융과 산업을 결탁하지 못하게 하는 원칙입니다.", "TRUE", "FALSE", "", "TRUE", "금산분리는 금융과 산업을 분리한다는 원칙이에요. 일반 기업이 은행을 또는 은행이 비금융 기업을 일정 수준 이상 소유하지 못한다는 내용인데요. 금융과 산업이 결탁될 때 나타나는 불공정 경쟁 등 문제점을 막기 위한 조치입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (33, "금융통화위원회(금통위)는 1년에 몇회 개최해 통화정책과 금융안정 등에 대해 논의합니다.", "TRUE", "FALSE", "", "TRUE", "금융통화위원회(금통위)는 1년에 24회 개최해 통화정책과 금융안정 등에 대해 논의합니다. 이 중 기준금리 등 통화정책을 결정하는 ‘통화정책방향 결정회의’는 8회 개최하고, 금융안정회의는 4회 개최합니다. 금통위는 한국은행 총재 및 부총재를 포함하여 총 7명의 위원으로 구성되어 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (34, "기간산업은 국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "기간산업(key industry)은 기초산업(Basic industry)이라고도 합니다. 국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 기간산업이라고 부릅니다. 기간산업은 제1차 세계대전 당시 독일이 영국을 상대로 수출을 제한하자 각종 공산품이 모자라 어려움에 빠졌던 영국에서 처음 사용된 용어예요. 오늘날은 경제의 토대가 되는 기초 산업을 의미하기도 해요. 항공이나 완성차, 조선처럼 필수 물류와 관련되거나 통신 및 에너지처럼 다른 산업을 운영할 때 없어서는 안 -되는 산업도 기간산업이에요. 우리나라의 반도체처럼 국가 경제에서 중요한 역할을 하는 산업도 기간산업입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (35, "기업결합은 서로 다른 기업이 하나로 합치는 것을 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "흔히 M&A, 인수합병이라고 부르는 건 기업결합의 한 종류입니다. 기업결합은 서로 다른 기업이 하나로 합치는 것을 뜻하는데, 인수합병 말고도 다양한 방식이 있어요. M&A는 Mergers(합병) and Acquisition(인수)의 약자예요. 순서가 거꾸로 돼 있긴 하지만 ‘인수합병’과 같은 뜻이에요. 인수합병에서 인수는 다른 기업의 경영권을 넘겨받는 것을 뜻합니다. 경영권을 넘겨준 기업에서는 매각했다고 표현해요. 합병은 둘 이상의 기업이 하나의 기업으로 합쳐지는 것을 뜻합니다. 공정거래위원회(공정위)는 시장 독점이 나타나거나, 지배적 사업자가 시장 경쟁을 제한하는 걸 막기 위해 기업결합 심사를 진행합니다. 매출액, 자산, 점유율 등 일정 기준을 넘어서는 기업결합이 심사 대상이에요. 공정위는 기업결합 이후에 시장점유율이 어떻게 바뀔지를 기준으로 평가하는데요. 시장 경쟁이 크게 제한되지 않을 전망이면 승인하지만, 시장 경쟁이 제한되는 상황이라면 불허 또는 조건부 - -승인 결정을 내리게 됩니다. 공정위가 불허를 내린 예시가 있습니다. 지난 2016년, SK텔레콤이 CJ 헬로비전을 인수하려 했을 때예요. 이동통신 시장에서 독과점 우려가 있었기 때문인데요. 결국 두 기업의 인수합병은 불발됐습니다. 조건부 승인 결정을 내린 경우도 있는데요. 딜리버리히어로와 우아한형제들 간의 기업결합이에요. 기업결합 심사 당시, 딜리버리히어로는 ‘요기요’와 ‘배달통’을 소유한 상태였어요. 우아한형제들까지 인수하면 배달업계의 시장점유율 약 90%를 차지해 독과점 사업자가 될 수 있었습니다. 이걸 막기 위해 요기요를 매각한 뒤 우아한형제들을 인수하라는 조건을 건 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (36, "기저효과는 경제지표를 평가할 때 임의로 정한 기준시점 때문에 결과가 왜곡되는 현상을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "경제지표를 평가할 때 임의로 정한 기준시점 -때문에 결과가 왜곡되는 현상이에요. 전년 대비 물가 상승률을 예로 들어 보겠습니다. 2020년과 대비했을 때, 2021년 연간 물가 상승률이 10%, 2021년 대비 2022년의 연간 물가 상승률은 2%라고 가정할게요. 2022년 전년 대비 연간 물가 상승률만 얘기했을 때는 2%로, 상당히 낮은 수치입니다. 하지만 사람들은 살림살이가 굉장히 팍팍하다고 생각할 거예요. 왜냐면 2020년을 기준으로 2022년 물가 상승률을 계산하면 고작 2년 만에 물가가 12.2%나 올랐으니까요. 이때 2022년 전년 대비 연간 물가 상승률 2%를 두고 기저효과가 적용됐다고 합니다. 이미 오를 만큼 올라서 더 크게 오르지는 않는다는 뜻이에요. 이런 기저효과는 지표를 축소해 나타내기도 하지만, 부풀려서 나타내기도 합니다. 경제지표를 읽을 때는 기저효과를 항상 염두에 둬야 해요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (37, "기준금리가 경제시장의 주기적이고 중요한 지표입니다.", "TRUE", "FALSE", "", "TRUE", "금리는 돈을 빌려줄 때, 미래에 더해질 가치를 계산해서 이자를 붙이는 것입니다.\n문제는 정확한 기준이 없다는 거예요. 물건이나 서비스마다 시간에 따라 비싸지는 정도가 다르니까요. 그래서 정부가 기준으로 내놓는 것이 기준금리입니다. -\n우리나라의 기준금리는 한국은행 금융통화위원회가 이런저런 경제지표를 참고해서 결정해요. \n기준금리를 올리면 ‘콜금리’라는 금리는 즉시 올라가게 됩니다. 콜금리는 은행, 증권사, 보험사와 같은 금융기관들이 ‘서로’ 돈을 빌릴 때 적용되는 금리예요. -\n콜금리가 상승하면 은행이 돈을 굴리며 금융시장을 끌어가는 데 비용이 더욱 들기 때문에 다른 금리도 전반적으로 오르게 되어 있어요. 기준금리가 콜금리를 움직이고, 콜금리가 다시 금융시장을 건드리고, 금융시장이 다시 경제에 영향을 주는 거예요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (38, "녹인(Knock-in)은 파생상품에서 기초자산 상태에 따라 수익 발생 지점과 손실 발생 지점이 있습니다.", "TRUE", "FALSE", "", "TRUE", "채권·주가지수·개별종목 등 기초자산이 있는 파생상품의 경우, 기초자산 상태에 따라 수익 발생 지점과 손실 발생 지점이 있습니다. 기초자산이 -특정 조건을 만족하면 수익이 나고, 특정 조건에서 벗어나면 손실이 발생해요. 이때, 파생상품에서 손실이 발생해 원금이 손실되는 것을 ‘녹인(Knock-in)’이라고 합니다. 원금손실구간에 진입하는 것을 ‘녹인 배리어(Knock-in barrier)’를 터치했다고 합니다. 기초자산이 있는 금융상품에 투자할 때는 ‘녹인(Knock-in)’ 조건을 반드시 살펴보고, 숙지해야 합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (39, "대체투자는 주식과 채권시장과 상관관계가 적은 자산에 투자하는 것을 뜻해요.", "TRUE", "FALSE", "", "TRUE", "대체투자는 주식과 채권시장과 상관관계가 적은 자산에 투자하는 것을 뜻해요. 구체적으로는 오피스, 호텔 등 부동산이나 사모펀드를 통한 기업 지분 투자, 인프라 투자 등이 있습니다. 중간 정도의 위험, 중간 정도의 수익률을 보여서 비교적 안정적이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (40, "대출우대금리는 대출받은 금액에 대한 특별한 금리를 말해요.", "TRUE", "FALSE", "", "TRUE", "대출우대금리(Loan Prime Rate, LPR)는 은행이 최우량 고객에게 제공하는 금리로 ‘사실상 중국의 기준금리’로 여겨집니다. -\n18개 시중은행이 매달 LPR을 중국 당국에 제출하면, 당국에서는 그 평균값을 내서 발표해요. \n우리나라는 금융통화위원회에서, 미국은 FOMC에서 기준금리를 결정합니다. -\n반면, 중국은 LPR을 기준으로 은행들이 일반 고객의 대출금리를 정합니다. 이렇게 해야 실질 대출금리를 낮출 수 있다는 게 중국 인민은행의 입장이에요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) - -values (41, "덤핑은 물건을 저가에 대량으로 팔아버리는 것을 말하는 단어입니다.", "TRUE", "FALSE", "", "TRUE", "‘덤핑(dumping)’은 쓰레기를 갖다 버리듯이 물건을 저가에 대량으로 와르르 팔아버리는 걸 뜻하는 단어예요. 저렴하게 파는 ‘할인 판매(세일)’와 ‘덤핑’ 사이에 절대적인 기준은 없어요. 다만 판매가가 원가보다 낮을 정도로 채산성(수익성)을 전혀 신경쓰지 않는다면 덤핑에 해당한다고 볼 수 있어요. 업계에서는 원가를 아니까 경험적으로 구분할 수 있죠. 덤핑은 정상가격으로 판매하는 업자들의 사정을 어렵게 만들어 시장질서를 교란시키기 때문에 다들 예민하게 반응하는 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (42, "디커플링(탈동조화)은 경제 상황이 부작용을 감수하고 독자적인 경제정책을 운영하거나, 서로 연관성이 옅어지는 현상을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "보통 한 나라의 경제는 그 나라와 관련 있는 다른 나라의 경제 상황과 비슷하게 흘러갑니다. 서로 무역과 투자를 하며 연결돼 있기 때문에 한 나라에서 너무 큰 변화가 일어나면 다른 나라도 어느 정도 그 변화에 따라가는 거예요. 이런 흐름을 커플링(동조) 현상이라고 합니다. 우리나라의 주요 교역국인 중국 경기가 좋으면 우리나라의 경기도 활발해지는 것이 자연스러운 동조의 예시입니다. 인위적인 동조화의 예시로는 미국처럼 기축통화를 가진 나라가 금리를 올리면 우리나라도 정책적으로 금리를 올리는 것이 있어요. 반대로 디커플링(탈동조화)은 부작용을 감수하고 독자적인 경제정책을 운영하거나, 어떤 계기로 서로 연관성이 옅어지는 현상이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (43, "리밸런싱은 포트폴리오를 주기적으로 점검하여 나의 자산배분 목표에 맞게 다시 -밸런스를 잡아주는 것이에요.", "TRUE", "FALSE", "", "TRUE", "포트폴리오는 자산배분 현황을 한눈에 보여줍니다. 리밸런싱은 포트폴리오를 주기적으로 점검해서 나의 자산배분 목표에 맞게 다시 밸런스를 잡아 주는 거예요. 돈관리를 건강한 몸 만들기로 비유해 볼게요. 가계부를 작성하는 건 내가 섭취하고 소비하는 칼로리를 기록하는 과정이고, 리밸런싱은 주기적으로 인바디를 체크해서 몸의 상태를 점검하는 거라고 볼 수 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (44, "리베이트는 기업 간의 거래에서 큰 금액이 오가는 경우에 빈번하게 일어나는 관행으로, ‘판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’이라고 할 수 있습니다.", "TRUE", "FALSE", "", "TRUE", "리베이트(rebate)는 프로모션의 한 종류입니다. 리베이트는 큰 금액이 오가는 기업과 기업 사이(B2B) 거래에 빈번하게 일어나는 관행이에요. 쉽게 말해 ‘판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’이라고 할 수 있죠. 예를 들어, A 회사가 1000만 원짜리 기계 10개를 B 회사에 판매하고 1 억 원을 받은 다음, 판매 금액의 10%인 1000만 원을 다시 B 회사에 돌려주는 것이 바로 리베이트예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (45, "리볼빙은 카드대금을 갚는 세 가지 방식 중 하나예요. 이 중에 ‘일부 금액’이 비율(%) 로 결정됩니다.", "TRUE", "FALSE", "", "TRUE", "리볼빙은 카드대금을 갚는 세 가지 방식 중 하나예요. ‘일부 금액’은 비율(%)로 결정됩니다. 이번 달에 갚을 총금액이 100만 원이고 리볼빙의 결제 비율을 10%로 설정한 경우를 가정해 볼게요. 이번 달에 낼 결제대금은 100만 원의 10%, 10만 원입니다. 나머지 90만 원은 다음 달로 넘어가요. 여기에 함정이 있습니다. 이번 달만이 아니라, 다음 달에도 전체 결제대금의 10%만 결제되고 나머지 90%는 다음 달로 넘어갑니다. 그다음 달에도 마찬가지예요. 문제는 갚아야 하는 원금에 ‘지난달에서 넘어온 돈’만이 아니라 ‘이번 달에 소비한 돈’ 까지 들어간다는 점이에요. 이게 반복되면 결제 대금이 눈덩이처럼 늘어나요. 게다가 리볼빙의 평균 대출금리는 10~15%에 달합니다. 당장은 결제대금에 대한 부담을 줄일 수 있지만, 순식간에 대출잔액이 늘어날 수 있는 고금리 대출상품이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (46, "리츠는 투자자들의 돈을 모아 부동산에 투자하고, 임대료·매각 차익 등 수익을 -배당으로 돌려주는 방식입니다.", "TRUE", "FALSE", "", "TRUE", "리츠는 다양한 부동산 자산을 묶어둔 투자상품입니다. 투자자들의 돈을 모아 부동산에 투자하고, 임대료·매각 차익 등 수익을 배당으로 돌려주는 방식이에요. 리츠를 통해 적은 돈으로도 부동산 시장에 투자할 수 있어요. 이 중 주식시장에 상장된 리츠를 ‘공모 리츠’라고 합니다. 리츠도 일반 기업이 주식시장에 상장될 때 밟는 과정을 똑같이 거쳐요. 리츠 투자로 얻을 수 있는 수익은 크게 두 가지가 있습니다. 리츠를 낮은 -가격에 사서 비싼 가격으로 팔아서 얻는 시세차익과 배당금을 받는 배당 수익이에요. 리츠는 배당 수익에 무게가 쏠려있는 투자상품이에요. 매년 배당가능이익의 90% 이상을 의무적으로 배당하고 있어서, -주주들에게 높은 배당금을 지급하는 걸로 유명합니다.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, - -option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (47, "마이너스통장은 신용대출의 방법 중 하나로서 부동산 같은 담보를 걸어놓지 않고 내 신용만을 믿고 빌려주는 방식입니다.", "TRUE", "FALSE", "", "TRUE", "마이너스통장은 신용대출의 방법 중 하나예요. 일단 부동산 같은 담보를 걸어놓지 않고 오직 내 신용만을 믿고! 약속한 한도만큼의 돈을 빌려주는 게 신용대출입니다. 신용대출에도 종류가 있습니다. 대출을 받을 때 빌리는 방식을 선택할 수 있어요. 건별로 한 번에 얼마씩 빌리는 방법이 있고 한도 내에서 통장에서 필요할 때 찾아 쓰는 방식이 있습니다. 건별로 빌리는 건 그대로 신용대출이라 불러요. 이 중 한도 내에서 통장에서 필요할 때 찾아쓰는 방식을 활용한 상품을 마이너스통장이라 부르죠.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (48, "증권사에서는 보고서로 상장 기업의 주식에 대한 의견과 목표 주가를 발표하여, 가까운 미래에 도달할 것으로 예상하는 목표 주가를 제시합니다.", "TRUE", "FALSE", "", "TRUE", " 증권사에서는 보고서로 상장 기업의 주식에 대한 의견과 목표 주가를 발표합니다. 기업의 이익 전망치를 고려해, 해당 기업의 주식을 살지(Buy), 팔지(Sell), 그대로 있을지, 비중을 확대할지, 비중을 축소할지 등의 의견을 내고 가까운 미래에 도달할 것으로 예상하는 목표 주가를 제시해요. 증권사 보고서는 의견과 목표 주가에 대한 이유를 중심으로 참고하는 게 좋습니다. 우리나라 증권사는 ‘팔자 (Sell)’ 의견을 거의 내놓지 않고, 목표 주가도 높게 잡는 경향이 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (49, "물적분할은 특정 기업이나 사업부문을 분할하여 이를 독립적으로 운영하는 것을 말해요.", "TRUE", "FALSE", "", "TRUE", "물적 분할은 ‘기업 분할’의 한 종류입니다. 기업 분할은 말 그대로 기업을 나누어서 가른다는 뜻이에요. -\n물적 분할은 어떤 기업(모기업)이 특정 사업부를 독립적인 회사(자회사)로 분리하면서, 모회사가 자회사의 지분 100%를 소유하는 걸 뜻해요. 기존에 모회사 투자자에게 자회사 주식이 돌아가지 않아요. \n자회사로 독립한 (구)사업부 때문에 모기업에 투자했던 투자자에게는 참 아쉬운 상황이에요. 직접적인 관련 없이 건너건너 아는 사이가 된 거니까요. -\n만약 자회사가 주식시장에 상장한다면? 모기업에 투자했던 투자자 입장에서는 배신감이 들 수밖에 없어요. 그동안 열심히 투자금을 보태왔더니, 알짜 사업을 갖고 따로 상장해버리는 거니까요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (50, "주가가 잘 오르다 말고 갑자기 큰 폭으로 하락하는 것은 반락입니다.", "TRUE", "FALSE", "", "TRUE", "영어로는 ‘a reactionary fall’로 주가가 잘 오르다 말고 갑자기 큰 폭으로 하락하는 현상을 뜻해요. 눌렀을 때 튀어 오른다는 뜻인 ‘반발’의 반대 의미라고 볼 수 있어요. ‘급락’과는 다릅니다. ‘주가가 크게 떨어졌다’는 상황 자체를 강조할 때는 급락을, ‘주가가 계속해서 오르고 있었다가 갑자기 떨어졌다’는 현상을 강조할 때는 ‘반락’을 사용해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (51, "벌지 브래킷은 전 세계를 상대로 채권이나 주식을 인수하고 글로벌 기업 M&A 자문을 하며 기업과 정부의 자금 조달을 주선하는 초거대 일류 투자은행을 말합니다.", "TRUE", "FALSE", "", "TRUE", "전 세계를 상대로 1 채권이나 주식 같은 유가증권을 인수하고 2 글로벌 기업 M&A( 인수합병) 자문을 하기도 하며 3 기업과 정부의 자금 조달을 주선하고 중개하는 등 투자은행이 할 수 있는 거의 모든 일을 하는 초거대 일류 투자은행을 말합니다. 투자은행은 장기적인 산업 자금을 담당하며, 개인은 상대하지 않습니다. ( ) 투자은행 중 벌지 브래킷은 약자로 ‘BB’라고 부르기도 해요. 현재 전 세계에 딱 아홉 개의 투자은행이 BB입니다. 바로 JP모건, 골드만삭스, 모건스탠리, 뱅크오브아메리카 메릴린치, 씨티그룹, 크레디트스위스, 바클리즈은행, 도이체방크, UBS예요.", -"TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (52, "베이지북은 특정 주식이 지난 mấy주 동안 기록한 가장 높은 주가를 말하는 것은 아닙니다.", "TRUE", "FALSE", "", "TRUE", "미국 연방준비제도이사회(연준)는 매년 8회 ‘ 베이지북’을 공개합니다. -\n연준 산하의 12개 지역 연방준비은행이 각 지역경제를 조사 및 분석한 보고서예요. 일종의 미국 경제 최신 동향 보고서라고 볼 수 있어요. 미국의 경제 현황을 파악하는 데 중요한 기준이 되기 때문에 눈여겨볼 필요가 있어요. -\n참고로 원래는 표지가 빨간색이라서 ‘레드북’이라고 불렸는데요. 일반인에게 공개되기 시작하면서 - -표지는 베이지색으로, 이름은 ‘베이지북’으로 바뀌어 불리게 됐답니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (53, "벤치마크는 금융시장에서 수익률의 기준을 의미하는 용어입니다.", "TRUE", "FALSE", "", "TRUE", "기준점 또는 표준을 의미합니다. 원래는 토목공학에서 토지 높이를 잴 때 기준점을 의미하는 용어였는데, 지금은 IT에서 성능 테스트를 할 때나 금융시장에서 목표 수익률을 정할 때도 활용하고 있어요. 금융에서 벤치마크 금리라고 하면 수익률의 기준이 됩니다. 미국 국채 10년물은 가계대출과 기업대출 등 다른 금융상품과 연동이 되어 있기 때문에 자주 시장의 벤치마크가 돼요. 미국 국채 10년물 금리를 기준으로 시장을 판단하겠다는 거예요. 개인 투자를 할 때도 활용할 수 있어요. 현재 주택담보대출 금리를 벤치마크 금리로 삼겠다고 하면, 현재 주택담보대출 금리보다는 더 벌어야 제대로 수익을 냈다는 의미예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (54, "보험회사의 보호예수가란, 고객이 예약금을 지불하여 얻는 이익이란 것입니다.", "TRUE", "FALSE", "", "TRUE", "보호예수(保護預受)는 ‘보호하다(보호) + 맡기다(예) + 받다 (수)’로 구성된 한자어입니다. 여기서 ‘예수’는 귀중품, 유가증권 등 어떤 것(주로 가치 있는 것)을 금융회사가 보관하는 것을 뜻해요. -\n우리나라 증권시장에는 어떤 요건에 해당하는 주주가 일정 기간 동안 보유한 주식을 사고 팔지 못하게 제한하는 ‘주식매도제한(Lock up)’이 있습니다. -\n보호예수는 ‘주식매도제한’을 실현하기 위한 장치 중 하나입니다. 기업의 주식을 많이 가진 최대주주 또는 특수관계인(투자자 등)이 일정 기간 주식을 매도하지 않도록 일시적으로 제한하는 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (55, "분양가상한제는 민간택지 분양가에 상한선을 정한 제도로, 주택공급이 위축되면서 적용대상을 강화해 제도가 흐지부지된 적이 있었다.", "TRUE", "FALSE", "", "TRUE", " 분양가상한제는 분양가에 상한선을 정한 제도입니다. 분양가상한제는 1977년 처음 도입된 후에 폐지와 부활을 반복했는데요. 2020년 7월 29일부터 시행된 분양가 상한제의 정식 명칭은 ‘민간택지 분양가상한제’입니다. 초기 분양가상한제는 공공택지에만 적용됐다가 2007년에 처음으로 민간택지에도 도입됐어요. 도입 이후 주택공급이 위축되면서 분양가상한제가 적용되는 민간택지의 요건을 강화해 제도가 흐지부지된 적이 있었는데요. 2020년부터 적용대상과 기준을 개정한 민간택지 분양가상한제를 시행했습니다. 2007년에 시행될 때는 전국에 동시 적용하는 제도였지만, 2020년부터 새롭게 적용된 민간택지 분양가상한제는 ‘투기과열지구’에만 적용됐습니다. 민간택지의 분양가상한가격은 ‘택지비+ 건축비’로 산정됩니다. 여기에 2022년 6·21 부동산대책으로 주거이전비, 손실보상비 등 추진과정에서 필수적인 요인의 합리적인 반영분과 자재가격 급등 반영분이 추가되었어요. 여기서 관건은 ‘택지비’ 입니다. 택지비는 시세가 아니라 감정평가액을 기준으로 하기 때문에 주변 땅값 시세보다 낮게 나와요. 택지비 감정평가액의 객관성도 중요한데요. 6·21 부동산대책으로 외부 검증위원회를 신설하는 규정이 생겼습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (56, "불만의 겨울은 영국에서 일어난 정치현상으로, 당시 정부가 인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데 노동조합이 크게 반발했습니다.", "TRUE", "FALSE", "", "TRUE", "불만의 겨울은 1978~1979년 영국에서 일어났던 정치현상이에요. 당시 영국 정부는 인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데, 노동조합이 크게 반발했습니다. 정부와 노조의 대립은 극단적으로 심해졌고, 사람들은 어느 편도 들지 않았어요. 이 현상은 정권이 바뀌며 마거릿 대처가 총리로 등장하는 데 영향을 주었어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (57, "불완전판매는 금융회사가 소비자에게 금융상품을 판매하는 과정에서 반드시 지켜야 할 사항을 누락하거나 정보를 허위, 과장하게 판매한 경우를 말해요.", "TRUE", "FALSE", "", -"TRUE", "은행, 증권사, 보험사 등 금융회사가 소비자에게 금융상품을 판매하는 과정에서, 반드시 지켜야 할 사항을 누락했거나 정보를 허위, 과장해서 소비자가 상품에 대해 잘못 인식하도록 판매한 사례를 뜻합니다. 원금 손실이 발생하는 금융 상품을 판매할 때, 은행은 고객에게 원금 손실이 발생한다는 사실을 고지하지 않았거나, ‘절대 손해보지 않는 안전자산’이라고 설명하는 식입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (58, "블랭크 세일링은 화물선 임시결항으로, 운송 수요나 운임이 급감할 때 피해를 - -최소화하려고 예정된 운항 전체나 특정 항구 정박을 취소하는 것을 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "블랭크 세일링(Blank Sailing)은 화물선 임시결항으로, 운송 수요나 운임이 급감할 때 피해를 최소화하려고 예정된 운항 전체나 특정 항구 정박을 취소하는 것을 뜻해요. 블랭크 세일링이 발생하면 개별 회사나 개인 소비자는 주문한 상품이 배송되기까지 더 많은 시간을 기다려야 할 수 있습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (59, "블록 경제는 서로 자유롭게 거래하는 국가들이 결집해 만드는 경제 시스템으로, 장벽을 쌓는 것은 외부 국가들과의 교섭을 저해해요.", "TRUE", "FALSE", "", "TRUE", "정치적, 경제적으로 관계가 깊거나 비슷한 문화를 가진 여러 국가가 결집해 ‘블록(block)’을 만드는 경제 시스템이에요. 블록 안에서는 서로 자유롭게 거래하는 반면, 블록 바깥 국가와는 거리를 두고 장벽을 쌓곤 합니다. 블록 경제는 식민지를 이용한 경제시스템이 돌아가던 18~19세기와, 1920~1930년대 대공황 이후 미·소 냉전 시절에 등장한 적이 있습니다. 현재 코로나19 팬데믹 이후 글로벌 공급망을 재편하면서 다시 경제가 블록화되고 있어요. 대체로 러시아와 중국을 한 블록으로 묶고, 미국을 -중심으로 한 국가를 한 블록으로 묶습니다. 인도나 동남아시아는 어디에도 끼지 않고 실리를 챙기려는 움직임을 보이고 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (60, "블록딜은 특정 주식이 특정 기간동안 기록한 가장 높은 주가를 말하는 데 대한 기준이 아니다.", "TRUE", "FALSE", "", "TRUE", "블록딜은 아주 많은 주식을 기관투자자 같은 대형 투자자에게 한 번에 넘기는 방식의 거래예요. -\n블록딜은 시장가보다 할인된 가격으로 진행되는 경우가 많습니다. 대량으로 주식을 사는 대상에게 할인가를 적용해 주는 거예요. -\n블록딜은 보통 시간외거래로 진행됩니다. 주식을 대량으로 보유한 주주가 블록딜 주관사(증권사와 같은 기관투자자)와 약속하고, 정규장이 마감된 뒤에 주식을 사고파는 식이에요. -\n블록딜은 기업 간 인수합병이나 경영상 이유로 기업에 많은 현금이 필요할 때 이루어지곤 합니다. \n블록딜이 정규장 시간대에 이뤄지면 매도물량이 쏟아져 나오면서 주가가 떨어질 수 있습니다. 증시에도 충격을 줄 수 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (61, "비경제활동인구는 취업하고 싶어도 일할 수 있는 능력이 없는 사람을 포함하지 않습니다.", "TRUE", "FALSE", "", "FALSE", "만 15세가 넘은 인구 가운데 취업자도 실업자도 아닌 사람을 뜻해요. 취직할 의사가 없고 구직활동을 하지도 않는 사람이 비경제활동인구에 속합니다. 실업자는 취업할 의지가 있고, 실제로 구직활동을 하는데도 취직하지 못하고 있는 사람이에요. 비경제활동인구는 일을 하고 싶어도 일할 수 있는 능력이 없는 사람도 포함해요. 또, 전업주부나 군인, 학생 등도 비경제활동인구에 속합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (62, "비둘기파는 2당파를 조절하는 데 사용되는 투표 방식으로, 의회에서 일정한 수의 표를 얻어야 하거나 특정 조건을 만족해야 한다.", "TRUE", "FALSE", "", "TRUE", "경제정책을 -이야기할 때, 종종 ‘비둘기’와 ‘매’가 등장하곤 합니다. -\n‘비둘기파’는 경기 부양을 위해 금리를 낮추고 시장에 돈을 푸는 양적완화를 주장하는 사람을 뜻하고, -‘매파’는 경기 과열을 막고 물가를 안정시키기 위해 금리를 높여야 한다고 주장하는 사람들 뜻해요. \nFOMC 파월 의장은 비둘기파와 매파의 중간인 ‘올빼미파’로 불립니다. 비둘기 혹은 매, 둘 중 하나로 치우쳐지지 않는 새로운 성향을 의미한다고 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (63, "빅스텝이란 기준금리를 올릴 때 0.25%p씩 올리는 것이 아니라, 한꺼번에 두 단계를 올리는 것을 말해요.", "TRUE", "FALSE", "", "TRUE", "보통은 기준금리를 올릴 때 0.25%p씩 올려요. 이번에는 0.25%p의 두 배인 0.50%p 만큼 올린 건데요. 이렇게 한꺼번에 두 단계를 올리는 것을 두고 ‘빅 스텝’이라고 불러요. 세 단계(0.75%p)를 올릴 때는 ‘자이언트 스텝’이라고 표현합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (64, "사모펀드는 투자자가 함께 모은 펀드를 말해요.", "TRUE", "FALSE", "", "TRUE", "펀드는 우리 말로 ‘기금’입니다. 기금은 ‘어떤 목적을 위해 모은 돈’을 뜻해요. 우리가 흔히 얘기하는 펀드는 자산을 불리기 위한 목적이 있습니다. -\n펀드는 투자자의 규모에 따라 ‘공모펀드’와 ‘사모펀드’로 나뉩니다. ‘공모펀드’는 불특정 다수에게 공개적으로 모집하는 펀드입니다. 주변에서 ‘펀드에 투자한다’고 하면 대부분 공모펀드라고 이해하면 - -돼요. -\n‘사모펀드’는 사적으로 모인 펀드입니다. 49인 이하의 투자자를 대상으로 공모펀드보다는 제한적이죠. -적은 모집인원에, 투자 금액도 최소 3억 원이라는 조건이 있습니다. -\n사모펀드 투자자 중에는 법인회사나 기관 투자자의 비율이 높아요. 개인 투자자 중에서는 은행, 증권사에 목돈을 맡겨둔 자산가, 노후자산을 맡겨둔 고령자가 사모펀드에 가입하곤 합니다. \n2019년~2020년 사이 사모펀드와 관련된 피해가 많았습니다. 라임자산운용이 운용한 ‘라임펀드’에서 발생한 ‘라임펀드 사태’가 대표적이었죠. 당시 라임펀드에 투자한 개인투자자 중 46%가 60대 이상의 고령자였어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (65, "사전청약은 특정 일정 전에 예약하거나 신청하는 것을 말합니다.", "TRUE", -"FALSE", "", "TRUE", "청약은 한자어로 ‘계약을 체결할 것을 요청하는 행위’를 뜻합니다. 새로 짓는 아파트를 분양 받을 권리(분양권)를 청약하는 것이 ‘주택청약’이에요. -\n청약은 보통 아파트 착공 후에 이루어집니다. 사전청약은 이보다 1~2년 이상 앞서서, 지구계획이 승인된 이후로 청약을 받는 제도예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (66, "산업활동동향은 경제의 성장률을 나타내는 지표 중 하나입니다.", "TRUE", "FALSE", "", "TRUE", "산업활동동향은 각 산업부문별 성적표로 크게 생산, 소비, 투자, 경기로 나눠서 동향을 분석해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (67, "유가증권시장'은 코스피, 코스닥, 코넥스를 통틀어 가리키는 말로는 쓰이지 않고, 오로지 코스피 시장을 가리키는 말로만 쓰인다.", "TRUE", "FALSE", "", "TRUE", "‘상장’은 기업이 데뷔하는 거예요 -\n상장은 기업이 공식적으로 유가증권시장 등 금융상품이 유통되는 시장에 등록해서, 기관 및 개인 투자자들이 자사 주식을 공개적으로 매매 및 유통할 수 있도록 하는 걸 말해요. 한자를 그대로 옮기면 ‘매대에 올린다’는 뜻이고, 영어로는 ‘be listed (company)’, 즉 명부에 등록됐다고 표현해요. \n일단 상장하고 나면, 유통시장에 들어와 있는 투자자들의 돈이 해당 기업에 수월하게 닿을 수 있어 자금 조달이 무척 용이해져요. 그만큼 상장사로 등록하기 위한 조건은 무척 까다로워요. 일정 수준 이상의 실적과 신뢰는 기본으로 갖춰야 하죠.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (68, "상장폐지를 의미하는 것은 기업이 주식시장을에서 철수하거나 종료하는 것을 말해요.", "TRUE", "FALSE", "", "TRUE", "어떤 기업의 주식이 코스피, 코스닥, 코넥스와 같은 주식시장에서 거래되려면, 그 기업이 주식시장에 상장(上場)해야 해요. 한자 그대로 해석하면 ‘시장에 명패를 내건 다’는 뜻입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (69, "생산자물가지수(PPI)는 제조업체의 가격이 상승하거나 하락하는 것을 나타내는 지표입니다.", "TRUE", "FALSE", "", "TRUE", "생산자물가지수(Producer Price Index, PPI)는 생산자 입장에서 측정한 물가입니다. 생산자가 물건과 서비스를 만드는 데 사용하는 상품과 서비스의 평균가격이라는 뜻이에요. -\n생산자물가가 상승하면 소비자물가가 올라요. 다시 말해, 인플레이션으로 이어질 가능성이 커요. 특히 미국의 인플레이션은 전 세계 시장에 영향을 미치기 때문에 미국의 생산자물가와 소비자물가 관련 지표를 주목하곤 합니다. -\n미국이 자국 경기 상황이 과다한 인플레이션 국면에 접어들었다고 판단하면, 기준금리를 올릴 수 있습니다. 기준금리를 조정해 시장에 풀리는 돈의 양을 조절하는 방식으로 인플레이션을 가라앉히려고 하는 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (70, "서비스 수지는 서비스를 사고 팔아 발생한 수입과 지출의 차이를 뜻해요.", "TRUE", "FALSE", "", "TRUE", "‘수지’는 한 나라가 다른 나라와 경제적 거래를 나눈 결과 발생한 수입과 지출을 뺐을 때 얼마인지 따져보는 거예요. 장사를 잘 해서 흑자를 보면 수지 흑자, 수입이 더 많아서 적자를 보면 수지 적자라고 합니다. 서비스 수지는 서비스를 사고 팔아 발생한 수입과 지출의 차이를 뜻해요. 서비스 수지에는 운수·여행·통신서비스·보험서비스·특허권 등 사용료·사업서비스·정부서비스· 기타서비스 8개 항목이 포함됩니다. 우리나라 서비스 수지는 보통 적자예요. 해외 교육 서비스나 해외 여행, 해외 로열티 지급 등의 서비스 지출이 굉장히 많거든요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, - -option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (71, "선물은 특정 상품이나 주식의 미래 가격을 예측하는 거래를 말합니다.", "TRUE", "FALSE", "", "TRUE", "선(先) + 물건 물(物). 한자 뜻 그대로 미래의 특정 시점에 물건을 사고파는 약속을 의미합니다. -\n선물거래는 농산물 시장에서 시작됐어요. 배추, 쌀, 밀과 같은 농·축·수산물은 생산량에 따라 가격변동이 특히 심하기 때문에, 미래의 가격을 미리 정해주는 선물거래를 이용해 가격변동 위험을 줄이려 했어요. -\n선물거래에는 두 가지의 지불 방법이 있어요. 현물을 직접 거래하는 인수도결제가 있고요. 현물을 직접 거래하지 않고 차익만 거래하는 현금거래가 있습니다.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (72, "소득공제는 세금을 매기는 기준이 되는 ‘소득’을 덜어주는 것이다.", "TRUE", "FALSE", "", "TRUE", "우리는 벌어들인 소득에 대한 세금을 내야 합니다. 세금은 소득을 신고할 때 내는데, 정부 정책 등으로 세금을 깎아주는 경우도 있어서 나중에 정산하는 절차가 필요해요. 직장인의 경우, 이 절차가 ‘연말정산’입니다. 세금을 깎아주는 방식은 크게 소득공제와 세액공제로 나뉩니다. 소득공제는 세금을 매기는 기준이 되는 ‘소득’을 덜어주는 것이고, 세액공제는 소득을 기준으로 계산한 ‘세금’에서 얼마간 덜어주는 것입니다. 연말정산을 할 때, 소득공제와 세액공제를 적용받고 난 ‘ 결정세액’을 계산합니다. 그리고 이 결정세액을 ‘내가 이미 낸 세금(기납부세액)’과 비교해, 더 낸 만큼 돌려받거나 덜 낸 만큼 더 내요. ‘연말정산 이후 돈을 토해냈다’고 하는 경우, 결정세액이 기납부세액보다 컸다는 뜻이에요. 반대로 ‘13월의 월급을 받았다’라고 하는 경우는 결정세액이 기납부세액보다 작다는 뜻입니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (73, "소비자물가지수가 특정 주식의 가치 추세를 나타내는 지표입니다.", "TRUE", "FALSE", "", "FALSE", "CPI는 ‘소비자물가지수(Consumer Price Index)’의 약자입니다. 시장에서 거래되는 모든 상품과 서비스의 가격을 중요도에 따라 가중치를 주어 평균을 낸 가격이에요. \nCPI는 어느 나라에서나 가장 기초적인 경제지표입니다. 1 (소득 관련 지표와 비교해) 소비자의 실제 생활 수준을 가늠할 수 있고 2 실제 경기와 가계의 소비 구조를 파악할 수 있고 3 각종 재정·경제 정책 결정의 기준·근거가 돼요. -\n미국의 CPI는 특히 중요합니다. 1 미국 GDP의 약 70%를 차지하는 민간소비의 실제 주체인 소비자의 행동을 파악할 수 있고 2 달러 인플레이션과 환율에서 강세, 약세 여부를 판단할 수 있고 3 이에 따른 미국의 금리 정책이 우리나라 증시와 교역에 많은 영향을 주기 때문이에요. -\n미국의 CPI는 매월 미국 고용통계국에서 발표합니다. 코로나19가 확산된 해인 2020년 12월부터 꾸준히 오르고 있어요. ‘이번에는 또 얼마나 올랐을까’ 걱정하는 뉴스가 매달 이맘때 쏟아지는 이유예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (74, "수요예측은 특정 제품이나 서비스의 판매량을 미래에 예측하는 것을 말합니다.", "TRUE", "FALSE", "", "TRUE", "수요예측은 공모주의 가격인 공모가를 결정하기 위해 수요상황을 파악하는 걸 말합니다. -\n공모주: 기업이 상장할 때는 신주(새로운 주식)를 발행하고 신주의 주인을 공개적으로 모집하는 ‘ 공모’ 단계를 거칩니다. 이때의 신주를 ‘공모주’라고 해요. -\n공모가: 공모주에는 상장 전에 거래되던 주식 가격이 아닌 새롭게 책정된 가격, 즉 공모가를 적용해야 합니다. 공모가는 먼저 대표주관회사가 발행 주식의 공모희망가격(밴드)을 제시하는 걸로 기준이 정해집니다. -\n수요상황 파악: 증권사, 보험사, 국민연금 등 기관투자자에게 수요예측을 실시해 공모희망가격 구간 내에서 얼마의 가격에 몇 주를 사고 싶냐는 수요를 물어봅니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (75, "수율은 반도체에서 ‘결함이 없는 합격품의 비율’을 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "수율은 한자어예요. 무언가를 거둔다는 뜻의 ‘수(收)’, 비율 ‘율(率)’로 이루어져 있습니다. 반도체에서 수율은 ‘결함이 없는 합격품의 비율’을 뜻해요. 웨이퍼 한 장에 들어갈 수 있는 칩의 최대 개수 중, 정상적으로 작동하는 칩의 개수를 나타냅니다. 반도체 기업에서 수율을 높이는 -것은 굉장히 중요해요. 수율이 높아질수록, 같은 원자재를 투입해서 더 많은 합격품을 만들어낼 수 있으니까요. 삼성전자, SK하이닉스 등 우리나라의 주요 반도체 기업도 수율을 끌어올리기 위해 기술을 개발하고 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) - -values (76, "스미싱은 문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하여 금융정보를 탈취하는 수법입니다.", "TRUE", "FALSE", "", "TRUE", "스미싱(Smishing)은 ‘ 문자메시지(SMS)’와 ‘피싱(Phishing)’을 합친 단어예요. 문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하는데요. 이후 악성 앱을 설치하거나 전화를 유도해 금융정보, 개인정보를 탈취하는 수법으로 사기에 이용해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (77, "스톡옵션이라고 하는 것은 주식을 살지 말지 선택할 수 있는 권리입니다.", "TRUE", "FALSE", "", "TRUE", "스톡옵션의 상법상 정식 명칭은 주식매수선택권입니다. 말 그대로 주식을 살지 말지 선택할 수 있는 권리라는 뜻인데요. ‘계약 당시에 정해놓은 가격’으로 살 수 있다는 게 엄청난 메리트입니다. 현재 주가가 올랐더라도, 싼 가격에 주식을 살 수 있다면 시세차익으로 돈을 벌 수 있으니까요. 대신 조건이 있습니다. 상법상, 스톡옵션은 회사에서 부여받은 시점을 기준으로 2년 이상 재직해야 행사할 수 있어요. 예를 들어볼게요. 독자님이 ‘어피티 주식을 1만 원에 살 수 있는 스톡옵션’을 받았습니다. 2년 뒤, 어피티가 폭풍 성장해서 주식 가격이 3만 원으로 올랐더라도 독자님은 주식을 1만 원으로 살 수 있어요. 그럼 독자님은 시세보다 훨씬 싸게 주1식을 사고, 다시 시세에 맞게 주식을 팔아서 그 차익으로 돈을 벌 수 있겠죠? 물론, 주식을 싸게 산 뒤에도 앞으로 더 오를 거라고 생각하면 계속 보유할 수 있습니다. 얻는 게 돈뿐만은 아닙니다. 최소한 스톡옵션에 -기재된 권리 행사 시점까지는 열심히 일할 동기부여가 될 테니까요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (78, "스팩(SPAC)은 특정 주식이 지난 얼마나 기간 동안 기록한 가장 높은 주가를 말해요.", "TRUE", "FALSE", "", "FALSE", "스팩(SPAC)은 ‘Special Purpose Acquisition Company’의 줄임말이에요. 그대로 번역하면, ‘기업 인수를 목적으로 하는 기업’을 뜻합니다. -\n스팩이 먼저 주식시장에 상장한 뒤, 상장하지 않은 상태의 기업(비상장기업)을 인수합니다. \n스팩은 ‘긁지 않은 복권’이라고 부르기도 해요. 어느 회사를 인수할지 정해지지 않은 상태에서 공모에 들어가기 때문이에요. -\n스팩이 특정 회사를 인수한다는 설이 돌면 스팩의 주가가 크게 뛰곤 합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (79, "스팩이 모은 돈으로 인수하는 기업의 이름을 공개하지 않는다.", "TRUE", "FALSE", "", "TRUE", "전통적인 기업공개 절차에서는 외부 회계 법인을 통해 회계 감사를 받고 감사보고서와 재무제표를 작성, 증권신고서와 함께 제출해요. 이때 금융감독원의 심사를 통과한 후 다시 한국거래소의 심사를 받아야 하는데요, 스팩은 실제 운영하지 않는 회사이므로 감사보고서 작성과 증권신고서 제출 절차에서 크게 증명할 것이 없어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (80, "스팩합병은 기업이 다른 기업의 주식을 모두 사가면서 모든 자산과 부채를 흡수하는 방식으로, 인수 합병의 한 형태입니다.", "TRUE", "FALSE", "", "TRUE", "스팩(SPAC, Special Purpose Acquisition Company)은 기업 인수를 목적으로 상장하는 종목입니다. 비상장 회사와 법적으로 합치는 데 필요한 페이퍼 회사예요. -\n투자자들이 돈을 모아 스팩을 주식시장에 상장시킨 뒤 비상장 회사와 합병하고 합병된 기업이 상장회사가 됩니다. 이를 ‘스팩합병’을 통한 상장이라고 해요. -\n지난해 1분기까지 미국에서 스팩 상장은 일반적인 기업공개(IPO) 상장보다 훨씬 쉬웠어요. 하지만 스팩 투자가 과열되자, 미국 당국이 기준을 까다롭게 바꿨습니다. 스팩 투자 열기가 다소 식으면서 -미국 스팩에 투자한 우리나라 개인 투자자들이 손해를 보기도 했어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (81, "시간외거래는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가를 말하는 것이 아닙니다.", "TRUE", "FALSE", "", "TRUE", "미국 주식 거래 시간은 우리나라 기준으로 오후 11 시 30분부터 오전 6시까지입니다. -\n썸머타임(3월 중순~11월 초)에는 거래시간이 1시간씩 앞당겨져요. 우리나라 -\n시간 기준으로 오후 10시 30분부터 오전 5시 사이에 거래할 수 있습니다. -\n국내 주식처럼 미국 시장도 장전, 장후 시간외거래를 할 수 있는데요. 단, 시간외거래가 가능한 프리마켓(pre-market)과 애프터마켓(after-market)의 시간은 증권사마다 차이가 있습니다. \n대부분의 국내 증권사 앱에서는 실시간 시세가 아닌, 15분 지연된 시세를 보여줍니다. 실시간 시세를 보여주는 별도의 앱이나 웹에서 정보를 얻어야 해요.", "TF", 1000000, 100000, FALSE); - -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (82, "신용평가는 기업이나 개인의 재무 상황을 평가하여 그에 대한 신뢰도를 판정하는 과정을 말해요.", "TRUE", "FALSE", "", "TRUE", "개인의 신용도를 평가하는 곳은 크게 두 종류가 있습니다. 하나는 NICE 평가정보, KCB, SCI평가정보와 같은 신용평가사. 다른 하나는 은행, 카드사, 보험사와 같은 금융회사예요. -\n금융회사는 고객이 신규로 금융상품에 가입하거나 이용할 때 신용을 평가합니다. 평가정보를 -바탕으로 ‘상품에 가입할 자격이 되는지’, ‘지금 조건대로 이 상품을 계속 이용할 수 있을지’를 판단해요. -\n금융회사와 신용평가사는 신용정보에 대한 모든 걸 관리 및 수집하고 전달하는 비영리 사단법인인 ‘신용정보원’으로부터 신용정보를 가져옵니다. 이 데이터를 갖고 각 회사의 자체 신용평가모델로 평가해요. -\n‘어디에서 신용등급을 조회하는지’, ‘어떤 은행에서 대출심사를 받는지’에 따라 신용등급과 대출금리, -대출한도가 다르게 나오는 이유가 이것 때문입니다. 같은 사람, 같은 신용정보라고 해도 ‘어디에서 평가하는지’에 따라 적용되는 신용평가모델이 다르니 결과가 다르게 나오는 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (83, "실업률은 고용률과 같은 것이 아니라는 것이다.", "TRUE", "FALSE", "", "TRUE", "실업률은 ‘경제활동인구’ 중에서 ‘실업자’가 차지하는 비율을 말해요. 경제활동인구는 ‘만 15세 이상 만 60세 미만 인구 중 경제활동 의사가 있는 사람’의 수예요. 쉽게 말해, 일할 의사가 있지만 직장을 찾지 못한 사람들의 비율이 실업률입니다. 반면 고용률은 경제활동인구든 비경제활동인구든 상관없이 ‘만15세 이상 64세 미만 생산가능인구 중 취업자가 차지하는 비율’을 말해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (84, "실적은 기업의 실제 성과를 의미하는 것이다.", "TRUE", "FALSE", "", "TRUE", "기업들의 실적은 분기별로 발표되는 분기보고서, 연간으로 발표되는 사업보고서에서 확인할 수 있어요. 보고서에서 핵심은 ‘재무제표’입니다. -\n4분기 보고서를 제외하고는 모두 각 분기가 마감되는 날짜로부터 45일 이내로 분기 보고서를 제출해야 해요. -\n연초에는 전년도 사업 실적을 ‘사업보고서’로 발표하고, 외부 감사를 받은 뒤 ‘감사보고서’를 제출하는 일정 때문에 굉장히 바쁩니다. 그래서 4분기 보고서는 제출 기한을 두 배(90일)로 줘요. \n2분기 실적의 경우, 1년의 반이 지난 시점에 발표되는 실적 보고서라서 ‘반기보고서’라고도 불립니다", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (85, "어닝쇼크는 기업이 실적을 발표할 때, 시장의 기대 이상으로 실적이 좋게 나오면 -이르는 경우를 의미합니다.", "TRUE", "FALSE", "", "TRUE", "‘어닝(earning)’은 수입, -벌이라고 이해하면 돼요. 기업이 분기별로 실적을 발표할 때, 시장의 기대 이상으로 실적이 좋게 -나오면 ‘어닝 서프라이즈’, 기대에 못 미치는 수준으로 실적이 낮게 나오면 ‘어닝 쇼크’라고 표현해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (86, "역직구는 우리나라 소비자들이 해외 온라인 쇼핑몰에서 직접 물건을 구입해 들여오는 행위입니다.", "TRUE", "FALSE", "", "TRUE", "우리나라 소비자들이 해외 온라인 쇼핑몰에서 직접 물건을 구입해 들여오는 행위를 직접 구매(직구)라고 합니다. 우리나라에 정식 유통되는 상품보다 저렴하거나, 우리나라에 유통되지 않는 물건을 구매할 수 있는 장점과 관세 등 행정처리를 직접 해야 하는 불편함이 있어요. 역직구는 우리나라에서 구입할 수 있는 상품을 외국 소비자에게 직접 판매하는 거예요. 역직구 플랫폼에 입점해 셀러가 된 다음, 내가 직접 상품을 골라 판매합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (87, "예대마진은 은행의 주요 수익모델로, 대출금리가 예금금리보다 높은 차이만큼 마진을 가져간다.", "TRUE", "FALSE", "", "TRUE", "예대마진(預貸margin)은 예금할 때 ‘예’, 대출할 때 ‘대’, 마진은 ‘차액으로 남긴 이윤’을 뜻합니다. 대출이자로 얻은 수입과 예금금리로 나간 지출의 차액으로 남긴 마진이라는 뜻이에요. 예대마진은 은행의 주요 수익모델입니다. 은행 상품을 보면, 대출금리가 예금금리보다 높아요. 이 차이만큼 은행이 마진을 가져가는 거예요. 이자를 통해 남기는 이익이기 때문에 예대마진을 다른 말로 ‘이자 이익’이라고도 부르는데요. 우리나라 은행은 이자 이익이 - -전체 수익원의 80% 이상이에요. 다른 나라 은행과 비교해보면 굉장히 큰 비중을 차지하는 편이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (88, "외자판호는 외국 게임이 중국에 출시될 때 필요한 인허가권입니다.", "TRUE", "FALSE", "", "TRUE", "외자판호는 외국 게임이 중국에 출시될 때 필요한 인허가권입니다. 이 이슈를 이해하려면 2016년으로 시간을 돌려봐야 해요. 지난 2016년, 한국의 사드 배치 발표로 중국 정부는 ‘한한령(중국 내 한류 금지령)’을 내리게 됩니다. 중국인 관광객들의 한국 방문을 통제하거나 한국 상품 수입을 규제하는 등 다양한 방식으로 압박해왔죠. 콘텐츠 전반에 한한령이 적용되면서, 국내 게임시장도 시련을 겪게 됩니다. 중국에 게임을 서비스하고, 수익활동을 하려면 ‘외자판호’가 필요한데 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임시장에서 중화권 매출이 절반 이상을 차지했습니다. 2020년부터는 조금씩 외자판호를 발급받는 사례가 나오기 시작했습니다. 하지만 여전히 희귀한 수준이라서, 외자판호 발급에 성공한 게임사의 주가는 급등세를 보이곤 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (89, "외환보유액은 정부가 여유자금으로 갖고 있는 외국 돈의 총 가치를 말해요.", "TRUE", "FALSE", "", "TRUE", "개인이 은행에 돈을 저축하고, 회사가 이익금에 자본을 쌓는 것처럼 정부도 여유자금을 저장해 둡니다. 그중에서도 정부가 중앙은행이나 다른 나라의 국립은행에 넣어둔, 외국 돈으로 된 자산의 총 가치를 ‘외환보유액’이라고 불러요. 정부가 여유자금으로 갖고 있는 외화는 달러, 유로화, 위안화, 엔화 등으로 국제무역에 자주 사용된다는 공통점이 있습니다. 외환보유액의 목적은 크게 네 가지예요. 1 국제무역에서 적자가 날 경우, 그만큼 채우고(국제수지 적자 보전) 2 외국에서 빌려온 돈의 원리금을 갚고 3 환율이 너무 떨어지거나 올라가면 외환시장에 개입해 방어하고 4 우리나라에 투자하려는 개인과 회사에 신용도를 쌓는 것이에요.", "TF", 1000000, 100000, -FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (90, "우대금리는 은행에서 정한 금리를 기준으로 추가로 금리 더하거나 빼서 조정할 수 있는 금리입니다.", "TRUE", "FALSE", "", "TRUE", "우대금리는 가감조정금리라고도 부릅니다. 은행에서 정한 금리를 기준으로 추가로 금리 더하거나(가), 빼서(감) 조정할 수 있는 금리거든요. 은행과 같은 계열의 카드사에서 카드를 만들거나 은행 계좌에서 공과금을 납부하는 등 조건을 맞추면 우대금리를 제공합니다. 예금금리를 연 0.1% 인상해주거나 대출금리를 연 0.2% 내리는 식이에요. 특판 적금, 대출 상품을 자세히 살펴보면 우대금리를 적용해서 ‘최대’, ‘~부터’ 같은 단어가 붙어있습니다. 적금은 이자를 많이 받을수록 좋으니 최대 금리를 적어놓고, 대출은 이자 부담이 적을수록 좋으니 최저 금리를 적어놓은 거예요. 브랜드 세일 광고에 최대 할인율을 적어두는 것처럼 고객 입장에서 최대 혜택을 받을 수 있는 금리를 보여주는 것과 비슷합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (91, "우리사주는 임직원들이 자기 회사 주식을 좋은 조건에 살 수 있도록 혜택을 주는 제도입니다.", "TRUE", "FALSE", "", "TRUE", "‘우리사주’는 말 그대로 우리 회사의 주식입니다. 임직원들이 자기 회사 주식을 좋은 조건에 살 수 있도록 혜택을 주는 제도예요. 우리나라에서는 기업이 상장하거나 유상증자를 할 때 새로 발행하는 주식 물량의 20%를 우리사주조합에 배정하게 돼 있습니다. 상장이나 유상증자 직후, 주가가 엄청나게 상승하면 주식을 팔아 수익을 내겠다고 생각할 수 있는데요, 이러기가 힘듭니다. 우리사주는 보호예수가 적용되기 때문에 일정 기간 처분할 수 없어요. 보호예수 기간이라도 우리사주를 처분하는 방법이 있습니다. 퇴사하는 건데요. 퇴사하면 주식이 한 달 후에 들어와서 처분할 수 있어요. 실제로 시세 차익을 위해 임직원이 사표를 내기도 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (92, "우선주는 특정 주식이 기록한 가장 높은 주가 중에서 해당 주식을 우선순위로 하는 -것을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "우선주는 보통주에 비해서 특정한 우선권을 부여한 주식입니다. 일반적으로 거래하는 ‘보통주’ 뒤에 ‘우’를 붙여서 표현해요. ‘삼성중공업’은 보통주, ‘삼성중공업우’는 우선주. 이런 식이에요. -\n우선주의 큰 특징은 1 보통주와 달리 주주총회에서 의결권을 행사할 수 없다, 2 그 대신 -보통주보다 배당수익률이 높다, 3 ‘일반적으로’ 보통주보다 주가가 40% 정도 낮고, 발행 주식 수가 적다는 점입니다. -\n이 중 3이 우선주의 괴리율을 크게 올려놓곤 합니다. 이슈가 생겼을 때 보통주보다 우선주에 수요가 몰리면서 거래량이 크게 늘고, 주가가 급등하는 식이에요. 우선주 급등 현상이 꾸준히 연출되자, 한 증권사 리포트에서는 ‘비정상의 구조화’라고 표현했어요.", "TF", 1000000, 100000, FALSE); - -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (93, "월세세액공제는 1년 동안 받은 총 급여액이 7천만 원 이하에 월세로 거주하면서, 세부 조건을 만족시키면 세액공제를 받을 수 있습니다.", "TRUE", "FALSE", "", "TRUE", "1년 동안 -받은 총 급여액이 7천만 원 이하에 월세로 거주하면서, 세부 조건을 만족시키면 월세액 세액공제를 -받을 수 있습니다. 세액공제 금액 예를 들어 볼게요. 총 급여액 3천만 원에, 매달 50만 원의 월세를 -낸 경우예요. 이 경우, 월세세액공제를 적용받아 월세의 1.5배 정도 되는 72만 원을 아낄 수 -있습니다. 월세세액공제를 받기 위해서는 무주택 세대주인지, 월셋집의 면적이 얼마나 되는지 등 조건을 따져봐야 해요. 조건에 맞으면 증빙서류를 준비해서 회사에 제출해야 합니다. 증빙 서류는 주민등록등본, -임대차 계약서 사본, 월세액 이체증(은행 등 금융기관에서 발급)이 있습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (94, "회사가 주식을 더 발행해 불특정 다수에게 파는 것을 '유상증자'라고 부릅니다.", "TRUE", "FALSE", "", "TRUE", "회사를 운영하다 보면 돈이 부족해질 때가 있습니다. 당장 사업을 유지하기에도 부족한 상황일 수도 있고, 사업을 좀 더 확장하기 위해 투자할 돈이 부족한 상황일 수도 있겠죠. 자금 조달 방법은 크게 두 가지입니다. 첫 번째 방법은 대출을 받는 거예요. 우리가 필요할 때 개인대출을 받는 것처럼, 기업도 기업대출로 돈을 끌어올 수 있습니다. 은행과 같은 금융회사를 매개로 하므로 ‘간접 금융’이라 불러요. 두 번째 방법은 기업이 직접 증권(채권, 주식)을 발행하는 ‘직접 금융’입니다. ‘지금 돈 빌려주면 나중에 이자 쳐서 갚을게~’ 약속하면서 채권을 발행하거나, 주식을 더 발행해 파는 방법이 있습니다. 이 중에서 후자를 ‘증자’라고 부릅니다. 일반적으로 증자라고 하면 유상증자를 말합니다. 회사가 돈이 필요할 때, 주식을 더 발행해 불특정 다수에게 파는 거예요. 대략 이런 시나리오예요. 회사마다 유상증자를 해야 하는 이유, 유상증자로 신주를 얻는 주체, 유상증자의 결과가 다 다르기 때문에 주주에게 호재일지, 악재일지는 잘 따져봐야 합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (95, "의무보유확약은 기업이 일정한 금액을 보유할 수 있는 의무적 기관을 의미합니다.", "TRUE", "FALSE", "", "TRUE", "의무보유확약은 어떤 것을 ‘의무’적으로 ‘갖고 있도록’ ‘확’ 실하게 ‘약’속하는 것을 뜻합니다. 주식시장에서는 주식을 팔지 않고 보유하고 있겠다는 약속을 뜻해요. -\n기업이 상장하기 전, ‘수요예측’이라는 절차가 있어요. 은행이나 증권사, 보험사, 연기금 등 기관투자자를 통해 투자 수요를 예측하는 단계입니다. “우리 회사가 상장하면 한 주당 얼마에, 몇 주 살래?”하고 물어보는 과정이라 생각하면 돼요. -\n수요 예측이 끝나면 기업과 상장주관회사가 협의를 통해 공모주 가격을 결정합니다. 그리고 각 기관투자자에게 몇 주씩 줄지 ‘배정 물량’을 결정하게 돼요. -\n이때 각 기관투자자가 어떤 기업인지(투자성향, 공모주 참여실적 등), 공모주 가격을 얼마로 제시했는지, 의무보유기간은 얼마간으로 잡았는지 고려합니다.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (96, "이머징 마켓은 아직 선진국에 속하지 않은 국가들이 해외 자본에 시장을 열기 시작할 -때 사용되는 용어입니다.", "TRUE", "FALSE", "", "TRUE", "이머징마켓은 금융시장에서 자주 사용되는 용어예요. 아직 선진국은 아니지만 급격한 경제 발전과 함께 해외 자본에 시장을 열기 시작한 국가들을 ‘이머징마켓’이라고 부릅니다. 이머징마켓 투자는 고위험 고수익이라는 특징이 있어요. 우리나라는 아직 이머징마켓으로 분류되는데, 계속해서 선진국 시장에 편입되려고 노력하는 중이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (97, "일몰제는 일정 기간이 지나면 효력이 상실되는 제도를 뜻해요.", "TRUE", "FALSE", "", "TRUE", "일몰제는 해가 어느 시점에 지는 것처럼, 일정 기간이 지나면 효력이 상실되는 제도를 뜻해요. 일몰제로 효력이 상실될 시기가 다가올 때, 정부는 해당 제도의 일몰 시한을 연장하기도 합니다. 신용카드 등 사용금액에 대한 소득공제의 경우, 10번 가까이 기한이 연장됐어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (98, "임상시험은 신약 개발에 성공한 후 시판 허가를 받는 프로세스를 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "‘신약 개발에 성공했다’라는 건 임상시험 절차를 통과해 시판 허가를 받았다는 것을 뜻합니다. 여기서 시판 허가를 받기 전 단계를 크게 ‘전 임상시험’, ‘임상시험단계’로 나뉩니다. 그중에서도 임상시험단계는 총 3상으로 나뉘어요. 각 단계를 통과하는 데 시간이 오래 - -걸리고, 성공 확률도 높지 않아 도중에 실패하는 경우가 대부분입니다. 국내 제약업계에서 개발에 성공한 신약은 지난 25년간 약 30개뿐이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (99, "입법예고는 새로운 법령의 개정 또는 제정을 앞두고 있는 상황을 의미해요.", "TRUE", "FALSE", "", "TRUE", "정책 관련 뉴스를 볼 때는 ‘정책이 어떤 단계에서 논의되고 있는지’ 확인해야 합니다. -\n‘발의됐다’라고 하면 국회에서 어떤 정책의 필요성에 대한 이야기가 나왔다는 뜻입니다. -\n‘발의된 법안이 의결됐다’라고 하면 그 이야기대로 정책을 만들겠다는 뜻입니다. 실무 관련 구체적 내용은 정해지지 않은 단계예요. -\n법안이 의결되면 법제처로 넘어갑니다. 법제처는 정책을 어떻게 법으로 만들지 고민한 다음, 실생활에 적용하도록 법령을 만들어 ‘입법예고’를 해요. -\n즉, 발의-의결-입법예고가 모두 끝나야 하나의 법이 만들어집니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (100, "전후방산업은 최종 소비자에 가까운 산업으로 특정 용도가 있고, 자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업입니다.", "TRUE", "FALSE", "", "TRUE", "전후방산업 기업활동에서 부가가치가 생산되는 과정을 가치사슬이라고 해요. 땅 속에 묻혀 있던 철광석을 캐내서 철강으로 만들면 철광석으로 존재할 때보다 부가적인 가치가 더해지는 식입니다. 전방산업은 용도가 특정되며 최종 소비자에 가까운 산업이에요. 후방산업은 자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업입니다. 자동차 산업이 제조업의 꽃이라고 불리는 이유는 최종 전방산업으로서 후방산업과 연관효과가 무척 크기 때문이에요. 수많은 고용과 부가가치를 창출하는 산업이에요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (101, "조각투자는 실물을 쪼개 소액으로 투자하는 방식을 말합니다.", "TRUE", "FALSE", "", "TRUE", "실물을 쪼개 소액으로 투자하는 방식을 조각투자라고 해요. 가치 상승이 기대되는 자산의 소유권을 여러 명이 공동투자해 수익을 분배하는 투자 방식입니다. 투자 대상으로 부동산이나 저작권, 미술품은 물론 선박과 대출채권 등이 있습니다. 실물자산에 대한 일부 권리도 가질 수 있습니다. 실제 10억 원짜리 건물에 만 원을 투자한다면, 건물의 만 원어치 일부를 소유할 수 있습니다. 아주 소액이지만 건물주가 될 수 있는 셈이죠. 하지만 여전히 위험은 있습니다. 현물의 가치를 제대로 산정해야 하고, 중간에 사업자가 파산하거나 거래플랫폼이 도산하면 투자금을 날릴 수 있어요. 투자자 보호를 약관에 명시하는 등 믿을 만한 플랫폼을 골라야 하고, 내가 투자하려는 실물에 대한 지식이 어느 정도 요구됩니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (102, "주주는 주주총회에서 회사의 경영状況과 재무제표를 확인할 수 있다.", "TRUE", "FALSE", "", "TRUE", "주주총회는 주식회사의 주주가 모여서 회사의 중요한 사안을 결정하는 의사결정회의를 뜻합니다. -\n설명이 어렵지만, 학급 회의와 크게 다르지 않습니다. 학급과 관련된 주요 안건을 두고 찬반 투표를 하고 의견을 나눴던 것처럼 주주총회에서도 회사와 관련된 주요 안건을 의논해 결정해요. \n주식회사라면 매년 최소 한 번 이상 주주총회를 개최합니다. 회사는 매년 1년 동안의 사업을 결산해 ‘결산 재무제표’를 만드는데요. 주주가 이 재무제표를 승인해줘야 확정할 수 있거든요. 이외에도 회사와 관련된 중요한 사안들을 싹 모아서 ‘정기 주주총회’를 여는 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (103, "주택연금은 현재 거주 중인 집을 국가에 담보로 맡기고 매달 연금으로 일정한 금액을 평생 받을 수 있는 상품입니다.", "TRUE", "FALSE", "", "TRUE", "주택연금은 현재 거주 중인 집을 국가에 담보로 맡기고 매달 연금으로 일정한 금액을 평생 받을 수 있는 상품입니다. 월 지급액은 가입자의 연령, 주택의 시장 가격, 이자율 등을 고려해서 산정해요. 다른 조건이 동일할 때, 주택의 시장 가격이 높을수록 월 지급액이 높아져요. 주택연금은 2019년 가입연령이 60세에서 55세로 하향됐어요. 가입 가능한 주택 가격 요건도 ‘시가 9억 원 이하’에서 ‘공시지가 9억 원 이하’로 완화됐습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (104, "중간재는 생산 과정에 투입물로 사용하는 재화입니다.", "TRUE", "FALSE", "", "TRUE", "생산자가 생산 과정에 투입물로 사용하는 재화예요. 원자재와 다른 점은 중간과정에 - -사용하기 위해 한 번 가공을 거친 상태라는 점이에요. 예를 들어, 철광석은 원자재지만 철광석을 녹여 만든 철판은 중간재라고 할 수 있어요. 중간재는 상품을 만들 때 최종소비자가 사는 완성된 결과물과도 다릅니다. 중간재인 철판은 최종소비자가 사용하기 어렵고, 자동차나 배를 생산하는 기업이 구매해 사용해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (105, "'잔존가치'는 자산의 내용연수가 끝날 때의 시장가치를 말합니다.", "TRUE", "FALSE", "", "TRUE", "누군가 사용하던 중고 물품을 정가와 동일한 가격에 구매하는 사람은 드물 거예요. 사려는 사람은 많은데 공급은 적어 프리미엄이 붙는 특수한 경우를 제외하면, 대부분의 상품은 개봉과 동시에 정가보다 낮은 가격에 거래됩니다. 심지어 포장을 뜯지 않았다고 해도 원래 가격보다는 낮은 가격에 거래되기 마련이죠. 누구나 새 걸 좋아하니까 생기는 일이에요중고 거래 가격은 소비자의 선호 체계를 고스란히 반영합니다. 구체적으로 세 가지 이유로 설명할 수 있습니다. -\n효용 극대화: 새 상품 구매가 훨씬 더 기분 좋아요. ‘새 상품을 샀을 때보다 덜 좋은 기분’이 중고 거래가에 반영돼요. -\n정보의 비대칭성: 내가 알지 못하는 다른 사람의 손에 들어갔던 물건은 어떻게 다뤄지고 변화했는지 알 길이 없습니다. 이전 소유자가 기업이나 판매자보다 깔끔하게 상품을 관리할 가능성은 아주 적어요. ‘불확실성 감당 비용’이 중고 거래가에 반영됩니다. -\n손실 회피: 중고 제품은 환불이나 A/S 등 그 상품을 제조하고 판매한 기업의 서비스 제공 범위에서 벗어나 있을 가능성이 큽니다. 잠재적인 문제 발생 가능성도 중고 거래가격 책정에 반영됩니다. -\n이런 경향을 한마디에 눌러 담은 것이 바로 감가상각이에요.", "TF", 1000000, 100000, -FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (106, "중립금리는 이론적으로 경제가 인플레이션(물가 상승)이나 디플레이션(경기 침체) 압력이 없는 잠재성장률 수준을 유지하게 만드는 이론적인 금리 수준입니다.", "TRUE", "FALSE", -"", "TRUE", "중립금리는 이론적으로 경제가 인플레이션(물가 상승)이나 디플레이션(경기 침체) -압력이 없는 잠재성장률 수준을 유지하게 만드는 이론적인 금리 수준이에요. 금리가 너무 높지도, -낮지도 않은 것을 뜻하죠. 중립금리는 절대적으로 정해진 수치가 아니라 그때그때 경제 상황에 따라 달라져요. 경제가 완전고용 상태이고 물가수준이 안정적인 상태에서 돈의 수요와 공급이 균형을 이뤄야 하니까요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (107, "지역화폐는 일반적으로 사용하는 화폐와 달라요.", "TRUE", "FALSE", "", -"TRUE", "지역화폐는 백화점 상품권과 같은 일종의 ‘유가증권’입니다. 현금처럼 사용할 수 있는 결제수단 중 하나지만, 일반적으로 사용하는 화폐와는 달라요. 우리가 흔히 쓰는 1천 원, 1만 원 권과 같은 화폐는 한국은행이 발행하는 한국은행권입니다. 국가에서 법으로 공식 인정한 화폐인 -한국은행권과는 다르게, 지역화폐는 지자체에서 마련한 조례에 따라 발행, 유통되기 때문에 조례에서 허용하는 범위 내에서만 사용할 수 있어요. 주로 지역상권 활성화, 지역 공동체 강화를 위한 목적으로 활용되고 특정 지역 내에서 제한된 구성원끼리 사용할 수 있습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (108, "챗GPT는 마이크로소프트사가 12조 원을 투자하여 만든 생성형 인공지능(AI)입니다.", -"TRUE", "FALSE", "", "TRUE", "챗GPT는 미국 인공지능연구소 OpenAI가 만든 생성형 인공지능 (AI)입니다. 마이크로소프트사가 12조 원을 투자했어요. 우리가 질문을 하면 온라인에 있는 정보를 갖고 알맞은 콘텐츠를 만들어요. -\n챗GPT 같은 생성형 AI는 어마어마한 빅데이터를 순식간에 처리해야 해요. 현재 반도체 구조로는 전력을 크게 잡아먹고, 비용도 많이 듭니다. 2023년 상반기 기준, 한 달에 1조 9천억 원의 운영비가 든다고 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (109, "최저임금은 기업이 직원에게 최소적으로 지불해야 하는 임금을 말해요.", "TRUE", "FALSE", "", "TRUE", "최저임금은 최저임금위원회의 논의 및 의결을 통해 결정됩니다. 매년 4 월경에 논의를 시작해 6월 말~7월 초·중순에 합의된 안을 발표하곤 해요. -\n구체적으로는 ‘고용노동부 장관이 최저임금위원회에 최저임금을 심의 및 의결하는 것을 요청한 시점’ 을 기준으로 90일 이내에 결정해야 돼요. -\n고용노동부 장관은 매년 3월 31일에 심의를 요청하고 있습니다. 그래서 원칙적으로는 6월 말까지 의결이 완료되어야 하지만, 경영계와 노동계의 입장이 좁혀지지 않으면 7월까지 넘어가기도 해요. \n최저임금위원회가 내년도 최저임금에 대해 결론을 내리고 나면, 고용노동부 장관이 8월 5일까지 - -결정된 내용을 발표합니다. 이때 고시된 최저임금의 효력이 다음 해 1월 1일부터 발생해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (110, "추가경정예산안은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하는 것이다.", "TRUE", "FALSE", "", "TRUE", "추경은 ‘ 추가경정예산’의 줄임말이고, 경정(更正)은 ‘바르게 고친다’라는 뜻이에요. 추가경정예산은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하죠. 연초에 세운 계획보다 돈을 더 쓰겠다는 건데요. 추경안은 자연재해나 큰 사고가 나서 인프라와 사회를 복구해야 할 때 나옵니다. 그래서 지난 추경안 규모를 보면 굵직한 경제적 충격들을 읽을 수 있어요. 추경 규모가 10조 원을 넘는 곳(빨간색 그래프)은 리먼브라더스 사태가 촉발한 세계 금융위기, 브렉시트 등 우리나라뿐만 아니라 세계적인 경제 위기가 있었던 시기입니다. 그중에서도 2020년과 2021년의 추경 횟수와 금액은 ‘역대급’이니, 코로나19가 세계적으로 얼마나 커다란 경제적 충격을 가져왔는지 알 수 있어요. 사실 추경 자체가 엄청나게 특별한 일은 아닙니다. 우리나라뿐만 아니라 전 세계 국가 대부분이 매년 추경을 실시합니다. 돈 쓸 일이 너무 많다 보니 1년 동안 얼마가 필요할지 정확하게 예측하기가 어렵거든요. 돌발사태가 발생하기도 하고요. 국가가 사업을 집행하는 데는 국민의 세금이 사용됩니다. 그래서 국민의 대리인인 국회의원과 정당이 추가예산이 필요하다는 행정부를 상대로 견제하기 시작합니다. ‘추경을 하느냐, 마느냐’보다는 추경 횟수와 액수 등을 두고 다투죠. 일명 ‘ 감액심사’라고 해요. 정치적 이해관계에 따라 여당이 행정부 편을 많이 들어주기도 하는데요. 보통 매년 추경을 하기 때문에 ‘필요하다’라는 쪽으로 결론이 나긴 합니다. 하지만 모든 추경안이 실행되는 건 아니에요. 예를 들어 어떤 정당이 추경을 해야할 만큼 꼭 필요한 사업이라고 생각하지 않고, 이들의 주장이 국회 다수결로 지지를 받는다면 추경안은 실행되지 않습니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (111, "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장이 잠시 멈출 때를 ‘캐즘’이라고 합니다.", "TRUE", "FALSE", "", "TRUE", "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장이 잠시 멈추는 구간을 ‘캐즘(Chasm)’이라고 해요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (112, "코스피는 어떤 지표를 나타내나요?", "TRUE", "FALSE", "", "TRUE", " 금융시장에서 ‘인덱스’는 ‘지수’를 뜻합니다. 여기서 ‘지수’는 IQ지수, BMI지수, 행복지수, 빅맥지수에 등장하는 것과 같은 개념이에요. ‘주가지수’는 주식의 가격을 ‘지수화’한 걸 의미하죠. \n우리나라 대표 주식시장인 유가증권시장에서는 유가증권시장은 ‘(현재 시점에서, 주식시장에 상장된 기업의 시가총액을 모두 합친 것) ÷ (과거의 특정 시점에서, 상장된 모든 기업의 시가총액을 모두 합친 것) x 100’으로 지수를 산출합니다. -\n‘과거의 특정 시점’은 고정돼있습니다. 유가증권시장은 1980년 1월 4일이 기준이에요. 이렇게 1980년 1월 4일과 현재를 비교하는 지수화 작업을 통해 산출한 숫자를 한국종합주가지수(KOrea Composite Stock Price Index)라고 부릅니다. 약자인 KOSPI, 코스피가 더 익숙할 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (113, "코스피200는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가를 말하지 않습니다.", "TRUE", "FALSE", "", "FALSE", "코스피200은 유가증권시장에 상장된 기업 중, 시가총액 등을 기준으로 상위 200개 기업의 주식을 지수화한 것을 뜻합니다. -\n유가증권시장에 상장된 모든 기업의 주식을 지수화한 KOrea Composite Stock Price Index( 한국종합주가지수), 즉 KOSPI와는 다른 지수예요. 일종의 우등생 클럽이라고 보면 됩니다. -\n한 국가의 대표 지수에 새롭게 편입되는 일은 기업에 큰 호재입니다. 국내외 투자자들이 많이 참고하는 지표인데다, 지수의 움직임을 따르는 펀드의 규모도 상당하거든요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (114, "퀵커머스는 온라인 커머스 시장에서 새로운 배송 서비스 형태를 뜻합니다.", "TRUE", "FALSE", "", "TRUE", "퀵커머스는 ‘퀵’(Quick)과 상거래 ‘커머스’(Commerce)의 합성어입니다. 음식 배달을 넘어 화장품이나 책, 약 등 다양한 제품을 1시간 안에 배송하는 서비스를 뜻해요. 온라인 커머스 시장의 당일배송이나 새벽배송보다 한 단계 진화된 형태예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, - -option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (115, "킹달러가 있는 경우, 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있습니다.", "TRUE", "FALSE", "", "TRUE", "달러 가치 초강세 현상을 뜻합니다. -2022년 미국 달러 가치는 20년만에 최고 수준으로 올랐는데, 미국 연방준비제도(연준)가 -인플레이션을 잡기 위해 금리를 급격하게 올렸기 때문이에요. 통화 가치가 높다면 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있어요. 반대로, 다른 나라의 통화 가치가 높아지면 환전할 때 우리나라 입장에서는 그 나라의 통화가 비싸지게 됩니다. 값비싼 통화를 사야 하니까요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (116, "타임래그(time-lag)는 어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상입니다.", "TRUE", "FALSE", "", "TRUE", "타임래그(time-lag)는 우리나라 말로는 ‘시간차’입니다. 어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상을 뜻해요. 경제학에서도 타임래그 현상을 종종 볼 수 있어요. 예를 들어, 기준금리를 낮추기로 결정한 뒤, 시장에 유동성이 풍부해지며 경기가 활성화되고 물가가 오르는 것도 시간차를 두고 발생하는 식이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (117, "테슬라요건은 특정 주식이 지난 몇 년간 기록한 가장 높은 주가이거나 이익을 -의미하는 것입니다.", "TRUE", "FALSE", "", "FALSE", "테슬라 요건의 정식 명칭은 ‘이익 미실현 기업 특례 상장’이에요. -\n테슬라 요건은 상장 요건에 미달하더라도 성장성이 높은 기업이 상장할 수 있도록 만든 특례 제도입니다. -\n미국 기업 ‘테슬라’가 적자였음에도 나스닥에 상장한 후 크게 발전한 사례에서 따와 ‘테슬라 요건’ 이라는 이름이 붙었습니다. -\n우리나라는 2017년부터 테슬라 요건을 적용하고 있어요. -\n국내에서 테슬라 요건으로 최초 상장한 기업은 온라인 상거래 플랫폼 사업을 영위하는 카페24예요.", -"TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (118, "티커는 특정 주식의(stock's) 등급이나 코드를 말해요.", "TRUE", "FALSE", "", "TRUE", "국내 주식을 할 때는 특정 주식을 검색할 때 ‘종목명’이나 ‘종목코드’ 6자리를 입력해요. \n미국 주식시장은 조금 다릅니다. 종목코드가 대문자 알파벳으로 돼 있거든요. 정식 명칭은 ‘티커 (ticker)’입니다. -\n티커로 주식이 어느 주식시장에 상장했는지도 구분할 수 있습니다. 뉴욕증권거래소에 상장된 종목은 주로 3자리 이내, 나스닥에 상장된 종목은 5자리 이내의 알파벳으로 티커를 정합니다. 테슬라는 -TSLA, 애플은 AAPL이 티커예요. 둘 다 나스닥에 상장된 기업이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (119, "파운드리는 반도체 기업이 설계도를 받아 주문 들어온 만큼만 반도체를 가공, 위탁 생산하는 것이다.", "TRUE", "FALSE", "", "TRUE", "반도체 기업은 크게 세 종류로 나뉩니다. 이중, 파운드리는 팹리스의 설계도를 받아다 주문 들어온 만큼만 반도체를 가공, 위탁 생산하는 기업이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (120, "페트로 달러 체제는 1975년부터 원유 대금을 미국 달러로만 결제하도록 한 시스템입니다.", "TRUE", "FALSE", "", "TRUE", "페트로 달러 체제는 1975년부터 원유 대금을 미국 달러로만 결제하도록 한 시스템으로 미국 달러를 세계 기축통화로 만든 원동력이에요. 페트로 달러 체제는 미국이 사우디 왕실에 전한 은밀한 제안에서 시작했어요. 1975년, 미국은 사우디에 ‘중동 맹주국 지위를 보장할 테니 원유 결제엔 달러화만 쓰라’고 제안했고, 사우디가 받아들였습니다. 이후로 미국은 사우디아라비아의 든든한 우방국으로 자리 잡았어요.", "TF", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (121, "포괄임금제는 근로계약을 할 때 연장·야간·휴일근무를 하는 것으로 가정하고 연봉에 관련 수당을 포함하는 임금 산정 방식입니다.", "TRUE", "FALSE", "", "TRUE", "포괄임금제는 근로계약을 할 때 연장·야간·휴일근무를 하는 것으로 가정하고 연봉에 관련 수당을 포함하는 임금 산정 방식입니다. 근로시간을 엄격하게 통제하기 힘든 시스템이나 선택적 근무제 등 비교적 자유로운 근무 문화를 가진 회사의 경우 포괄임금제로 연봉을 산정하는 경우가 많아요.", "TF", 1000000, 100000, - -FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (122, "프로젝트 파이낸싱(PF)은 특수목적법인(SPC)을 설립하여 해당 사업 자체를 담보로 -잡아 돈을 빌리는 방식입니다.", "TRUE", "FALSE", "", "TRUE", "PF는 프로젝트 파이낸싱의 약자예요. 건설 등 특정 사업을 프로젝트로 진행할 때 이 사업만 담당하는 특수목적법인(SPC)을 세우고, -해당 사업 자체를 담보로 잡아 돈을 빌립니다. 만약 공장 건설 프로젝트를 PF로 진행한다고 하면 이 공장이 앞으로 물건을 생산·판매해 들어올 수익까지도 계산해서 대출을 받을 수 있습니다. 리스크가 상당히 큰 대출 방식이에요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (123, "필립스곡선은 인플레이션과 실업률 사이에 직접적인 관계가 있다는 경제학 모형입니다.", "TRUE", "FALSE", "", "FALSE", "필립스곡선은 실업률과 인플레이션(물가 상승) 사이 반비례 관계가 있다는 경제학 모형이에요. 여기서 인플레이션은 임금상승률(명목)로 나타냅니다.", -"TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (124, "하드 블록 전략을 사용하면 비수기에는 시세보다 다소 비싸게 대량구매를 해두는 것은?", "TRUE", "FALSE", "", "TRUE", "여행사가 여행 패키지 상품 구성을 위해 미리 사둔 항공권이에요. 하드 블록 전략을 이용하면 비수기에는 시세보다 다소 비싸게 대량구매를 해두고, 성수기에는 시세보다 저렴하게 대량구매를 해두어 안정적인 여행객 수요 대응을 할 수 있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (125, "한미 금리역전은 미국의 기준금리가 한국보다 낮아진 것을 뜻합니다.", "TRUE", "FALSE", "", "FALSE", " 한미 금리역전은 미국의 기준금리가 한국보다 높아진 것을 뜻해요. 보통 국가의 신용도가 높을수록 기준금리가 상대적으로 낮아요. 예를 들어 경제규모 세계 1위이자 기축통화국인 미국은 다른 개발도상국보다 낮은 금리를 유지하죠. 우리나라도 보통 미국보다 기준금리가 높고요. 기준금리가 낮다는 건, 해당 국가의 돈값(이자)을 매기는 기준이 다른 국가보다 낮다고 해석할 수 있는데요. 투자자 입장에서는 같은 돈을 미국 달러에 투자했을 때 받는 돈값이 적더라도, 달러를 매력적으로 느낍니다. 신용도가 높고 경제력이 탄탄해 안전하니까요. 미국보다 상대적으로 금리가 높은 우리나라와 같은 국가도 다른 의미로 매력적인 투자처예요. 상대적으로 높은 금리, 즉 높은 수익률을 제공하기 때문이에요. 그런데 미국이 인플레이션을 해소하기 위해 기준금리를 올리면서, 우리나라보다 돈값을 높게 쳐주기 시작했어요. 안전한데다 금리까지 높다면? 우리나라 금융시장에 투자하던 외국인 투자자들이 돈을 빼서 미국으로 향할 수도 있어요. 물론 그렇지 않았던 사례도 있었지만, 한국과 미국의 금리가 역전되면 대책이 필요하다는 얘기가 나오곤 해요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (126, "한한령은 중국 정부가 우리나라의 사드 배치 발표로 내린 금지령입니다.", "TRUE", "FALSE", "", "TRUE", "지난 2016년, 우리나라의 사드 배치 발표로 중국 정부는 ‘한한령(중국 내 한류 금지령)’을 내립니다. 중국인 관광객들의 우리나라 방문을 통제하거나 우리나라 상품 수입을 규제하는 등 다양한 방식으로 압박해왔어요. 콘텐츠 전반에 한한령이 적용되면서 국내 게임업체도 시련을 겪었어요. 중국에 게임을 서비스하고 수익활동을 하기 위해서는 ‘외자판호’가 반드시 필요한데, 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임업체의 매출 중 큰 부분이 중화권 매출이었습니다. 그런데 진출 자체가 막혀버렸으니 엄청난 악재가 될 수밖에 없었어요. 이후 국내 콘텐츠 전반에 적용되던 한한령이 하나둘 풀리기 시작했지만 유독 게임 분야는 규제가 풀리는 속도가 느렸어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (127, "할증은 택시 또는 고속버스를 이용할 때 기존 요금에 얼마를 더한 금액을 적용하는 것입니다.", "TRUE", "FALSE", "", "TRUE", "나눌 ‘할(割)’, 더할 ‘증(增)’을 합친 한자어예요. 일정 기준에 얼마를 더한다는 뜻으로, 영어로는 ‘extra charge’로 번역할 수 있어요. 보통 아래와 같은 상황에서 사용됩니다. 심야 할증: 심야에 택시 또는 고속버스를 이용할 때, 기존 요금에 얼마를 더한 금액을 적용하는 것", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (128, "행동주의펀드는 기업의 경영에 적극적으로 참여하는 투자전략을 갖고 있는 펀드를 말합니다.", "TRUE", "FALSE", "", "TRUE", "행동주의펀드는 헤지펀드 중에서도 기업 의결권을 - -확보할 수 있을 만큼 투자해 기업의 경영에 적극적으로 참여하는 투자전략을 갖고 있는 펀드를 뜻합니다. 행동주의펀드 역시 최대 이익을 추구합니다. 기업의 자산을 매각해 현금흐름을 개선하고 주주배당을 -확대하며, 구조조정을 통해 핵심 자산 가치를 불리는 방식을 요구하기도 해요. 행동주의펀드는 기업의 군살을 없애고 주주의 권리를 올리며 기업 수익을 극대화한다는 장점을 갖고 있지만, 기업의 단기적 수익에 집착하다가 본질을 해치고 ‘먹튀’한다는 비판을 동시에 받곤 합니다.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (129, "행복주택은 특정 주택이 일정한 기준을 충족하여 주민들에게 제공하는 주택으로 정의된다.", "TRUE", "FALSE", "", "TRUE", "행복주택은 대학생, 사회초년생, 신혼부부, 고령자 등을 위해 LH가 새로 건설해 공급하는 공공임대주택을 말합니다. -\n특징: 행복주택은 직장과 학교와 가까운 곳(직주근접)이거나 대중교통 이용이 편리한 곳에 위치하고, 주변에 다양한 주민 편의시설을 함께 짓는다고 해요. -\n임대료: 행복주택에도 여러 가지 유형이 있는데요, 유형별 입주자격과 소득·자산기준을 충족할 경우 주변시세 대비 60~80% 저렴한 임대조건으로 입주할 수 있어요. -\n기간: 행복주택의 총 임대기간은 대학생·청년 6년, 유자녀 신혼부부 10년, 고령자·수급자 20 -년으로 설정돼있어요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (130, "환차손은 기업이 외국에서 취급하는 бізнес을 하다가 환율이 내려가면 발생하는 손해를 말합니다.", "TRUE", "FALSE", "", "TRUE", "‘환차손’은 환율 변동에 따른 손해를 뜻합니다. 반대말은 ‘환차익’이에요. -\n1,200원을 1달러로 바꾼 그 시점에는 환차손이나 환차익이 발생하지 않아요. -\n1,200원 주고 산 1달러를 다시 우리나라 돈으로 바꿔야 할 때 환율이 변동해 1,000원을 받게 되면 200원의 환차손이 발생하는 거죠. -\n200원은 투자원금 1,000원 기준 20%나 된답니다. 다시 말해, 1달러에 1,200원에서 1,000원이 됐을 때 기준 미국 증시에서 번 돈을 환전해서 실질적인 수익이 나는 시점은 수익률 21%부터인 거예요.", "TF", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (131, "은행 외에는 고금리의 사금융밖에 선택지가 없던 시기에 정부가 만들었다는 금융기관의 유형은?", "2금융권", "상호신용금고법", "사금융", "1금융권", "은행 외에는 고금리의 사금융밖에 선택지가 없던 1970년대, 정부에서 ‘상호신용금고법’을 만들어 사금융을 양성화하기 시작했습니다. 이때부터 나타난 회사들은 특정 그룹이나 분야에 전문성을 가진 회사였습니다. 이렇게 새로운 금융회사들이 만들어지던 시기에, 은행과 은행이 아닌 금융회사를 구별해서 부르기 시작했습니다. 예전부터 있었던 은행을 1금융권으로, ‘은행이 아닌’ 금융회사를 2금융권으로 부르게 된 거죠. 1 금융권인 은행과 2금융권에 속해있는 저축은행의 경우, 예금과 대출을 해준다는 측면에서 비슷한 -기능을 하기 때문에 소비자 입장에서는 같은 선상에 두고 비교해볼 만합니다.안정성이 높지만 수익률( 이자율)이 낮은 1금융권 예금을 택할지, 대출금리가 높지만 대출받기가 더 쉬운 2금융권 대출을 -택할지 비교해보는 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (132, "여러 번 사용이 가능한 전지를 말할 때 사용하는 용어는?", "1차전지", "3차전지", "2차전지", "2차전지", "2차전지는 충전과 방전을 통해 여러 번 사용이 가능한 전지예요. 대표적인 2차전지로는 휴대폰 배터리가 있습니다. 종류는 납 축전지, 니켈카드뮴 전지, 니켈수소 전지, 리튬이온 전지 등이 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (133, "특정 주식의 52주 신고가는 무엇입니까?", "주식시장", "52주 신고가", "주식가격", -"52주 신고가", "52주 신고가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 높은 주가를 말해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (134, "주식의 가장 낮은 주가를 의미하는 단어는?", "최고가", "52주 신저가", "시가", "52주 신저가", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (135, "금융뉴스에서 자주 언급되는 ‘만분율’ 단위의 움직임을 표현하는 약자는?", " - -퍼센트포인트", "베이시스포인트", "금리점수", "베이시스포인트", "기준금리 뉴스에 자주 등장하는 ‘bp’는 ‘basis point’의 약자예요. 금융에서 쓰이는 기본단위로, 금리나 수익률, 환율을 나타낼 때 사용합니다. 일반적으로 사용하는 백분율이 아닌 ‘만분율’ 단위의 움직임을 표현하는데요. 1bp는 0.01%p, 10bp는 0.1%p, 100bp는 1%p예요. 금융시장에서는 0.01%p의 움직임도 영향력이 커요. 그래서 0.01%p도 뉴스에 자주 언급됩니다. 백분율을 기준으로 ‘퍼센트포인트’라고 말하는 것보다 만분율을 기준으로 bp로 나타내는 것이 정보전달에 더 효율적이라서 사용한다는 얘기가 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (136, "내 소득 대비 금융부채 원리금 상환비율을 나타내는 단어는?", "LDR", "DSR", "CPR", "DSR", "DSR(Debt Service Ratio)은 내 소득 대비 금융부채 원리금 상환비율이에요. DSR 40%라면 내 연 소득이 1억 원일 때, 1년 동안의 원금과 이자 상환비율이 4천만 원을 넘지 않는 정도까지 대출을 해준다는 뜻이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (137, "소득 대비 금융비용 부담률을 나타내는 지표는?", "DSR", "DTI", "CPI", "DTI", "DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. DTI는 ‘나의 연소득’에서 ‘주택담보대출의 원금 상환과 이자, 다른 대출의 이자로 나가는 금액’이 차지하는 비중으로 구합니다. 내가 가진 모든 대출의 원리금 상환금액을 합쳐 따지는 DSR보다는 유한 기준입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (138, "환경, 사회, 회사의 가치를 고려한 투자 방식을 뜻하는 단어는?", "이자율", "ESG", "P/E비", "ESG", "ESG는 Environmental(환경), Social(사회), Governance(지배구조)의 첫 글자를 조합한 단어로 기업의 친환경 경영, 사회적 책임, 투명한 지배구조 등을 의미합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (139, "증거금리를 따라 가는 인자펀드를 뜻하는 단어는?", "펀드", "ETF", "인덱스펀드", -"ETF", "ETF(Exchange Traded Fund)는 말 그대로 인덱스펀드를 거래소에 상장시켜 투자자들이 주식처럼 편리하게 거래할 수 있도록 만든 상품입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (140, "G7의 약자로 불리는 회담이 열리는 7개국의 이름은 무엇입니까?", "중국, 러시아, 인도", "미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본", "유럽 연합, 아시아권, 미국", "미국, -캐나다, 영국, 독일, 프랑스, 이탈리아, 일본", "G7. Group of Seven Summit. 주요 7개국 정상회담의 약자입니다. 미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본 7개국은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최해요. 이 회담뿐만 아니라 이 회담에 참여하는 7개국을 G7이라고 줄여 부르기도 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (141, "GNI와 유사한 지표는 무엇입니까?", "GNP", "GDP", "CPI", "GDP", "GNI는 Gross National Income의 약자로, ‘국민총소득’입니다. GNI는 일정 기간 내 ‘우리나라 국적을 -가진 사람’이 벌어들인 모든 소득을 더한 거예요. 우리나라에 거주하고 있는 외국인의 소득은 제외하고, -외국에 거주하는 우리나라 국민의 소득을 포함해요. GNI를 구하는 가장 큰 이유는 국가가 아니라 국민들의 생활 수준을 알아보기 위해서예요. GNI와 유사한 지표로는 GDP가 있어요. GDP는 ‘한 국가에서 생산된 모든 부가가치의 총합’으로 국가 경제의 규모를 나타내죠. 위의 그림으로 이해하자면 사과는 부가가치, 사과박스는 국가의 영토, 과수원은 부가가치를 창출하는 국민ᆞ회사를 뜻해요. A 국적을 가진 국민ᆞ회사(과수원)가 전 세계에서 부가가치(사과)를 창출하는 상황을 가정해볼게요. GDP 는 사과 박스에 사과가 얼마나 들었는지를 보는 것과 비슷합니다. 사과가 많이 든 박스가 경제력이 큰 국가라고 볼 수 있고요. GNI는 과수원에서 나오는 사과들의 총합이라고 볼 수 있어요. 생산량이 많은 과수원이 GNI가 큰 국가예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (142, "전 세계 자원이 거쳐가는 글로벌 생산기지를 나타내는 비율은?", "국제 무역액", "GVC 후방참여율", "수출입 지수가", "GVC 후방참여율", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 비율을 말해요. 이 수치가 높은 나라일수록 전 세계 자원이 거쳐가는 글로벌 생산기지라 할 수 있어요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, - -option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (143, "LTV는 주택담보대출에서 계산하는 비율은 무엇입니까?", "총부채상환비율", " 주택담보대출비율", "대출가능금액지표", "주택담보대출비율", "LTV는 주택담보대출비율(Loan to Value ratio)입니다. 공식은 ‘(대출한 금액) / (아파트 가치)*100’이에요. 즉, 총 아파트 가치에 비교한 대출금의 비중을 보여줘요. LTV는 주택담보대출의 대출가능금액을 산출할 때 사용돼요. LTV 기준비율은 지역에 따라 다른데요. 평균 40~70% 수준입니다. DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. LTV로는 대출받을 수 있는 최대금액을 계산하면 되고, DTI로는 대출 받고자 하는 금액이 소득 수준과 비교해서 적합한지 확인할 수 있습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (144, "회사 규모를 키우거나 시장에서 경쟁력을 키우는 것을 목표로 하는 조직간의 통합을 뜻하는 단어는?", "경영제안", "M&A", "합병", "M&A", "기업이 다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념이에요. M&A는 ‘Merger( 합병)&Accquisition(인수)’의 약자로, 인수&합병 순서가 반대예요. 인수와 합병 안에서도 어디까지 인수하고, 어떻게 합병하느냐에 따라 세부적인 종류가 나뉩니다. 기본적인 목적은 회사 규모를 키우거나 시장에서 빠르게 경쟁력을 키우는 것이에요. 예를 들어 더 작은 회사의 기술이 지속적으로 필요할 때, 비슷한 업계에서 비슷한 일을 하고 있는 몇 개의 회사가 합쳐져 큰 회사가 되려고 할 때 M&A를 할 수 있습니다. 이 과정이 기존 경영진이나 기존 주주들의 합의에 의해 이뤄지면 우호적 M&A, 기존 경영진이나 주주의 의사와는 관계없이 경영 환경 등에 의해 이뤄지면 적대적 M&A라고 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (145, "제조업 구매관리자지수(PMI)’는 다음과 같은 의미를 지니게 하는 지표예요.", " 고용율지표", "제조업 구매관리자지수(PMI)", "기업경기실사지수(BSI)", "경기동향지표", "‘ISM 제조업 구매관리자지수(The ISM manufacturing Index)’는 생산 관련 지수예요. ‘PMI 지수’라고도 불러요. PMI 지수는 미국의 민간 경제단체인 공급관리협회(The Institute of Supply Management) 에서 매달 19종 400개 이상의 전·후방 제조업 구매담당자에게 설문을 돌려 만드는 경기동향지표입니다. -제조업 실무자에게 재고 수준이나 신규 주문량, 고용 상황 등은 어떻게 되어가고 있는지 등 현재 업황을 물어보기 때문에 업계 전망을 직접적으로 파악할 수 있어요. 우리나라로 치면 한국은행이 조사하는 ‘기업경기실사지수(BSI)’와 비슷해요. PMI 지수는 매월 첫 영업일에 발표됩니다. 다른 거시경제 지표보다 일찍 발표되면서도 이후 발표될 거시경제 지표와 큰 차이가 날 리는 없으니, 이번 달 경기 움직임을 미리 보여주는 지표라고 할 수 있어요. PMI 지수는 0부터 100 사이에서 수치가 결정됩니다. 50을 기준으로 해서 50보다 낮으면 제조업경기가 전보다 수축되었다고 볼 수 있고, 50 보다 높으면 제조업경기가 전보다 확장되어 간다고 해석해요. 절대적으로 좋다, 나쁘다라고 해석하기보다는 ‘전월 대비 이번 달은 어떤지’에 대한 추세가 중요한 지표입니다. 만약 PMI 지수가 좋게 나오면 미국 증시뿐만 아니라 우리나라 증시도 분위기가 좋아질 수 있습니다. 미국의 제조업 업황이 좋으면 우리나라의 수출도 늘어나기 때문이에요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (146, "나의 소득에서 세금이나 보험료를 제외한 실제로 쓸 수 있는 돈은?", "예금", " 가처분소득", "예산", "가처분소득", "가처분소득은 내가 번 소득 중 소비와 저축으로 쓸 수 있는 돈을 뜻해요. 구체적으로는 내가 번 돈에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다. 소득 분위에 따라 실제로 사람들의 소득수준이 어떤지 볼 수 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (147, "회사의 재무제표를 확인하고 의견을 표명하는 보고서는?", "재무제표", "감사보고서", -"경영보고서", "감사보고서", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다. 감사보고서 의견은 ‘적정’, ‘부적정’, ‘한정’, ‘의견거절’ 총 네 가지예요. 이 중 ‘적정’을 제외한 ‘부적정’, ‘한정’, ‘의견거절’은 ‘비적정’에 해당돼요. 코스닥 상장기업이 ‘비적정(부적정, 한정, 의견거절)’ 의견을 받으면 바로 상장폐지 사유가 발생합니다. 코스피 상장사의 경우 ‘부적정’ 또는 ‘의견거절’을 받거나 ‘한정’을 2년 연속 받으면 상장폐지 사유가 발생합니다. 감사보고서 제출 기한을 앞두고 기업도, 주주도 예민해지곤 합니다. 상장폐지 사유가 발생하면, 그 사유가 해소될 때까지 주식 거래가 정지되거든요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (148, "economy에서 개인이 직접적으로 사용하는 물품과 서비스의 총액을 나타내는 것은?", - -"고용", "개인소비지출 (PCE)", "생산", "개인소비지출 (PCE)", "개인소비지출(Personal Consumption Expenditures, PCE)은 가계가 재화와 서비스를 구매하는 데 사용하는 지출을 의미합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (149, "주식시장에서 주식을 사고 팔 때의 총 금액을 나타내는 지표는?", "주가", " 거래대금", "투자수익", "거래대금", "거래대금은 주식이 사고 팔린 총 금액입니다. 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다. 거래대금이 크다는 것은 그만큼 거래량이 많다는 뜻이에요. 거래량과 거래대금은 주가지수와 함께 주식시장의 경기를 판단하는 중요한 자료로 활용되고 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (150, "경기순환사이클의 가장 큰 구분은?", "회복기와 활황기", "회복기-활황기-후퇴기- 침체기", "회복기, 후퇴기, 침체기", "회복기-활황기-후퇴기-침체기", "경기가 일정 주기를 두고 상승과 하락을 반복하는 현상을 경기순환이라고 합니다. 크게, 회복기-활황기-후퇴기-침체기가 돌고 돌아요. 경기순환의 전반적인 흐름을 파악하면 투자 전략을 짜는 데 도움이 될 수 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (151, "우리나라와 외국 사이의 상품·서비스의 수출입을 기록한 장부는?", "국제수지", " 경상수지", "무역장부", "경상수지", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동·자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부라고 할 수 있어요. 경상수지는 ‘국제수지’라는 지표의 일부분입니다. 국제수지는 우리나라가 다른 국가들과 서로 거래한 내역을 기록한 회계장부라고 생각하시면 돼요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (152, "경기가 호황으로 잘 나가다가 갑자기 실업자와 자산 가치 폭락을 겪는 경우를 뜻하는 단어는?", "연착륙", "경착륙", "덤핑", "경착륙", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 주식, 부동산 등 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 자본주의 경제 시스템에서는 호황과 불황이 주기적으로 찾아옵니다. 불황이 왔을 때 부작용을 최소화하며 경기 침체에 대응한다면 연착륙이라고 하고, 대응에 실패해 우당탕 급락과 폭락을 하게 된다면 경착륙이라고 해요. 경착륙은 원래 항공용어로, 비행기 구조가 손상될 정도로 거칠게 착륙하는 행위를 말해요. 연착륙은 서서히 속도를 조절해가며 활주로에 기체가 부드럽게 내려앉는 것입니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (153, "주식을 공개적으로 사들이는 방식으로 회사의 경영권을 손에 얻게 되는 경우가 있는 것을 뜻하는 단어는?", "적대적 M&A", "공개매수", "인수합병", "공개매수", "공개적으로 주식을 사들인다는 뜻이에요. 공개매수는 특히 적대적 M&A(인수합병)의 방법으로 자주 활용됩니다. 회사의 대주주가 지분을 넘기려고 하지 않을 때, 그 회사를 인수하려는 곳에서 다른 주주의 지분을 공개매수를 통해 사들이는 방식이죠. 그렇게 해서 얻은 지분이 기존 대주주보다 많다면 사실상 회사의 경영권을 손에 얻게 되니까요. 공개매수는 일정 기간을 잡아놓고, 그 기간 안에 시장 밖에서 주식을 사는 방식으로 이루어집니다. 이때, 시장에서 거래되는 주식 가격보다 높은 가격을 불러요. 기존 주주는 물론, 지분을 더 확보하려는 대주주가 주식을 더 사도록 만들기도 해서, 공개매수 공시가 나오면 -주가가 상승하는 모습을 보이곤 합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (154, "회사에서 급여를 줄 때, 직원의 4대보험료와 소득세를 나라에 대신 내주는 방식을 무엇이라 하는가?", "소득세징수", "공제", "원천징수", "공제", "공제(控除). 당길(공), 덜다(제). 사전적 의미로는 ‘뺀다’라는 뜻입니다. 세금 얘기할 때 등장하면 ‘특정 금액을 덜어준다’라고 해석하면 돼요. 회사에서 급여를 줄 때, 4대보험과 소득세를 공제한 금액을 입금합니다. 직원의 4대보험료와 소득세를 나라에 대신 내주거든요. 이렇게 세금을 걷는 방식을 원천징수라고 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (155, "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태예요. 이 형태는?", "자발적 금융", "관치금융", "자율금융", "관치금융", "정부가 민간 금융기관의 인사와 자금 운용에 직접 개입하는 금융 형태예요. 금융이 법이나 시장 원리보다는 정책에 영향을 받아 - -움직이게 됩니다. 관치금융은 우리나라 금융시장의 특징이기도 합니다. 1990년대 이전 고도성장기에는 금융이 ‘국민 경제 성장’이라는 정치적인 목적을 위해 움직였어요. 당시 수출대기업에 금융지원을 몰아주는 정책은 강력한 성장 엔진이 되기도 했어요. 지금의 관치금융은 ‘금융만은 국가가 안전하게 보호해야 한다’와 ‘정부의 관리가 금융권의 자생력과 혁신을 가로막고 있다’는 이야기를 동시에 듣고 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (156, "OO를 통해 경제 활동의 크기와 방향을 알 수 있습니다.", "민간소비", "국내총생산 (GDP)", "경상수", "국내총생산(GDP)", "한 나라의 영역 내에서 가계, 기업, 정부 등 모든 경제주체가 일정기간 동안 생산한 재화 및 서비스의 부가가치1)를 시장가격으로 평가하여 합산한 것으로 여기에는 비거주자가 제공한 노동, 자본 등 생산요소에 의하여 창출된 것도 포함되어 있습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (157, "제품을 대량생산할 때, 단위당 생산 비용이 하락하는 현상을 가리키는 경제적 성질은?", "고정비용의 원칙 -\n(Fixed cost principle)", "규모의 경제 -\n(Rule-of-thump economics)", "단위생산 비용의 증가", "규모의 경제", "규모의 경제는 기업이 생산량을 늘리면서 제품 하나를 만드는 데 드는 단위당 생산 비용이 하락하는 현상이에요. 1천만 원을 들여 마스크 공장을 세웠을 때, 마스크를 딱 하나만 찍어내면 마스크 하나를 찍어내는 데 드는 비용은 1천만 원이에요. 하지만 고객의 주문이 늘어나 마스크를 1천 개 찍어내면 마스크 한 개당 생산 비용은 1만 원이 됩니다. 이렇게 고정비용이 줄어드는 규모의 경제가 실현되면 장기적으로 생산 비용이 줄어들어서 수익이 증가하게 돼요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (158, "비즈니스 분야에서 규제를 이행하고자 하는 회사의 실내 환경을 말하는 것은?", " 보증", "규제 샌드박스", "시장분석", "규제 샌드박스", "규제 샌드박스는 새로운 제품이나 서비스를 출시할 때 일정 기간 규제를 면제하거나 유예하는 제도예요. 혁신적인 서비스를 개발할 수 있다면 일단 제약 없이 해보라는 거예요. -\n샌드박스라는 의미는 모래놀이터(Sandbox)에서 유래되었어요. 모래놀이터에서 아이들이 덜 다치고 안전하게 노는 것 처럼 규제 샌드박스에서는 마음껏 아이디어를 펼쳐보라는 의미죠.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (159, "기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 표방하는 걸 홍보하는 걸 뜻하는 단어는?", "에코프리엔드", "그린워싱", "트래시핑", "그린워싱", "그린 워싱은 ‘Green’ 과 ‘White Washing’을 합친 말로, 기업이 실제 친환경 경영과는 거리가 멀지만 마치 녹색경영을 표방하는 것처럼 홍보하는 걸 의미합니다. 한마디로 친환경인 것처럼 세탁한다는 뜻이에요. 매출, 영업이익과 같은 재무정보와 달리, ESG 등 비재무정보는 평가 기준을 마련하기가 쉽지 않은데요. 빈틈을 이용해 ‘마치 ESG 성과를 잘 내는 것처럼’ 보이도록 그린 워싱을 하는 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (160, "생활비용에 영향을 주는 물가의 주요한 지수를 말하는 것은?", "국제물가지수", " 근원소비자물가지수", "근원판매자물가지수", "근원소비자물가지수", "소비자물가를 포함한 물가지수에는 ‘명목지수’와 ‘근원지수’ 두 종류가 있습니다. 소비자물가 명목지수는 흔히 ‘ 소비자물가지수’라고 불려요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (161, "은행이 금리를 인하하도록 요구하는 가장 강한 권리는?", "환급요구권", " 금리인하요구권", "통화정책위원회", "금리인하요구권", "금리인하요구권은 말 그대로 ‘(대출)금리를 내려달라고 요구할 수 있는 권한’이에요. -\n신용상태나 상환능력이 대출 당시보다 크게 좋아졌을 때 금리인하요구권을 행사해 대출금리를 낮출 수 있습니다. 구체적인 사유로는 신용등급 상승, 취업, 이직, 승진하거나 전문직 자격증을 땄을 때, 자산이 늘고 부채가 줄었을 때 등이 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (162, "금융과 산업을 분리하는 원칙이란 무엇입니까?", "금융규제", "금산분리", " 경영가치론", "금산분리", "금산분리는 금융과 산업을 분리한다는 원칙이에요. 일반 기업이 은행을 - -또는 은행이 비금융 기업을 일정 수준 이상 소유하지 못한다는 내용인데요. 금융과 산업이 결탁될 때 나타나는 불공정 경쟁 등 문제점을 막기 위한 조치입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (163, "금융통화위원회(금통위)는 매년 몇 회에 걸쳐 개최되는가?", "12회", "24회", "36 회", "24회", "금융통화위원회(금통위)는 1년에 24회 개최해 통화정책과 금융안정 등에 대해 논의합니다. 이 중 기준금리 등 통화정책을 결정하는 ‘통화정책방향 결정회의’는 8회 개최하고, 금융안정회의는 4회 개최합니다. 금통위는 한국은행 총재 및 부총재를 포함하여 총 7명의 위원으로 구성되어 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (164, "국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 뜻하는 단어는?", " 기초산업", "기간산업", "기본산업", "기간산업", "기간산업(key industry)은 기초산업(Basic industry)이라고도 합니다. 국가 경제를 운영할 때 필수적인 기술과 설비, 생산품을 기간산업이라고 부릅니다. 기간산업은 제1차 세계대전 당시 독일이 영국을 상대로 수출을 제한하자 각종 공산품이 모자라 어려움에 빠졌던 영국에서 처음 사용된 용어예요. 오늘날은 경제의 토대가 되는 기초 산업을 의미하기도 해요. 항공이나 완성차, 조선처럼 필수 물류와 관련되거나 통신 및 에너지처럼 다른 산업을 운영할 때 없어서는 안 되는 산업도 기간산업이에요. 우리나라의 반도체처럼 국가 경제에서 중요한 역할을 하는 산업도 기간산업입니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (165, "기업결합의 목적은 ?", "경영권을 넘겨주기 위함", "시장 경쟁을 제한하는 걸 막기 위해", "새로운 제품을 개발하기 위함", "시장 경쟁을 제한하는 걸 막기 위해", "흔히 M&A, 인수합병이라고 부르는 건 기업결합의 한 종류입니다. 기업결합은 서로 다른 기업이 하나로 합치는 것을 뜻하는데, 인수합병 말고도 다양한 방식이 있어요. M&A는 Mergers(합병) and Acquisition(인수)의 약자예요. 순서가 거꾸로 돼 있긴 하지만 ‘인수합병’과 같은 뜻이에요. 인수합병에서 인수는 다른 기업의 경영권을 넘겨받는 것을 뜻합니다. 경영권을 넘겨준 기업에서는 매각했다고 표현해요. 합병은 둘 이상의 기업이 하나의 기업으로 합쳐지는 것을 뜻합니다. 공정거래위원회(공정위)는 시장 독점이 나타나거나, 지배적 사업자가 시장 경쟁을 제한하는 걸 막기 위해 기업결합 심사를 진행합니다. 매출액, -자산, 점유율 등 일정 기준을 넘어서는 기업결합이 심사 대상이에요. 공정위는 기업결합 이후에 시장점유율이 어떻게 바뀔지를 기준으로 평가하는데요. 시장 경쟁이 크게 제한되지 않을 전망이면 승인하지만, 시장 경쟁이 제한되는 상황이라면 불허 또는 조건부 승인 결정을 내리게 됩니다. 공정위가 불허를 내린 예시가 있습니다. 지난 2016년, SK텔레콤이 CJ헬로비전을 인수하려 했을 때예요. 이동통신 시장에서 독과점 우려가 있었기 때문인데요. 결국 두 기업의 인수합병은 불발됐습니다. 조건부 승인 결정을 내린 경우도 있는데요. 딜리버리히어로와 우아한형제들 간의 기업결합이에요. 기업결합 심사 당시, 딜리버리히어로는 ‘요기요’와 ‘배달통’을 소유한 상태였어요. 우아한형제들까지 인수하면 배달업계의 시장점유율 약 90%를 차지해 독과점 사업자가 될 수 있었습니다. 이걸 막기 위해 요기요를 매각한 뒤 우아한형제들을 인수하라는 조건을 건 거예요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (166, "경제지표를 읽을 때 왜곡되는 현상은?", "변동성", "기저효과", "트렌드", " 기저효과", "경제지표를 평가할 때 임의로 정한 기준시점 때문에 결과가 왜곡되는 현상이에요. 전년 대비 물가 상승률을 예로 들어 보겠습니다. 2020년과 대비했을 때, 2021년 연간 물가 상승률이 10%, 2021년 대비 2022년의 연간 물가 상승률은 2%라고 가정할게요. 2022년 전년 대비 연간 물가 상승률만 얘기했을 때는 2%로, 상당히 낮은 수치입니다. 하지만 사람들은 살림살이가 굉장히 -팍팍하다고 생각할 거예요. 왜냐면 2020년을 기준으로 2022년 물가 상승률을 계산하면 고작 2년 만에 물가가 12.2%나 올랐으니까요. 이때 2022년 전년 대비 연간 물가 상승률 2%를 두고 기저효과가 적용됐다고 합니다. 이미 오를 만큼 올라서 더 크게 오르지는 않는다는 뜻이에요. 이런 기저효과는 지표를 축소해 나타내기도 하지만, 부풀려서 나타내기도 합니다. 경제지표를 읽을 때는 기저효과를 항상 염두에 둬야 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (167, "은행이 돈을 빌려주는 최저 가격을 뜻하는 단어는?", "환율", "기준금리", " 주식가치", "기준금리", "금리는 돈을 빌려줄 때, 미래에 더해질 가치를 계산해서 이자를 붙이는 것입니다. -\n문제는 정확한 기준이 없다는 거예요. 물건이나 서비스마다 시간에 따라 비싸지는 정도가 다르니까요. -그래서 정부가 기준으로 내놓는 것이 기준금리입니다. -\n우리나라의 기준금리는 한국은행 금융통화위원회가 이런저런 경제지표를 참고해서 결정해요. \n기준금리를 올리면 ‘콜금리’라는 금리는 즉시 올라가게 됩니다. 콜금리는 은행, 증권사, 보험사와 - -같은 금융기관들이 ‘서로’ 돈을 빌릴 때 적용되는 금리예요. -\n콜금리가 상승하면 은행이 돈을 굴리며 금융시장을 끌어가는 데 비용이 더욱 들기 때문에 다른 -금리도 전반적으로 오르게 되어 있어요. 기준금리가 콜금리를 움직이고, 콜금리가 다시 금융시장을 건드리고, 금융시장이 다시 경제에 영향을 주는 거예요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (168, "기초자산이 특정 조건을 만족하면 수익이 나고, 특정 조건에서 벗어나면 손실이 발생하는 파생상품의 경우, 원금이 손실되는 것을 무엇이라고 하나요?", "녹아웃 (Knock-out)", " 녹인 (Knock-in)", "배리어 브레이크 (Barrier Break)", "녹인 (Knock-in)", "채권·주가지수· 개별종목 등 기초자산이 있는 파생상품의 경우, 기초자산 상태에 따라 수익 발생 지점과 손실 발생 지점이 있습니다. 기초자산이 특정 조건을 만족하면 수익이 나고, 특정 조건에서 벗어나면 손실이 발생해요. 이때, 파생상품에서 손실이 발생해 원금이 손실되는 것을 ‘녹인(Knock-in)’이라고 합니다. 원금손실구간에 진입하는 것을 ‘녹인 배리어(Knock-in barrier)’를 터치했다고 합니다. 기초자산이 있는 금융상품에 투자할 때는 ‘녹인(Knock-in)’ 조건을 반드시 살펴보고, 숙지해야 합니다.", -"MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (169, "주식과 채권시장을 중심으로하지 않는 자산에 투자하는 것을 뜻하는 단어는?", " 사모펀드", "대체투자", "인프라 투자", "대체투자", "대체투자는 주식과 채권시장과 상관관계가 적은 자산에 투자하는 것을 뜻해요. 구체적으로는 오피스, 호텔 등 부동산이나 사모펀드를 통한 기업 지분 투자, 인프라 투자 등이 있습니다. 중간 정도의 위험, 중간 정도의 수익률을 보여서 비교적 안정적이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (170, "은행이 고객에게 제공하는 대출 상품의 금리를 낮게 조정하는 방식을 나타내는 단어는?", "이자율", "대출우대금리", "금융규제", "대출우대금리", "대출우대금리(Loan Prime Rate, LPR)는 은행이 최우량 고객에게 제공하는 금리로 ‘사실상 중국의 기준금리’로 여겨집니다. \n18개 시중은행이 매달 LPR을 중국 당국에 제출하면, 당국에서는 그 평균값을 내서 발표해요. \n우리나라는 금융통화위원회에서, 미국은 FOMC에서 기준금리를 결정합니다. -\n반면, 중국은 LPR을 기준으로 은행들이 일반 고객의 대출금리를 정합니다. 이렇게 해야 실질 대출금리를 낮출 수 있다는 게 중국 인민은행의 입장이에요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (171, "물건을 저가에 대량으로 팔아버리는 걸 뜻하는 단어는?", "할인 판매", "덤핑", " 정가제한", "덤핑", "‘덤핑(dumping)’은 쓰레기를 갖다 버리듯이 물건을 저가에 대량으로 와르르 팔아버리는 걸 뜻하는 단어예요. 저렴하게 파는 ‘할인 판매(세일)’와 ‘덤핑’ 사이에 절대적인 기준은 없어요. 다만 판매가가 원가보다 낮을 정도로 채산성(수익성)을 전혀 신경쓰지 않는다면 덤핑에 해당한다고 볼 수 있어요. 업계에서는 원가를 아니까 경험적으로 구분할 수 있죠. 덤핑은 정상가격으로 판매하는 업자들의 사정을 어렵게 만들어 시장질서를 교란시키기 때문에 다들 예민하게 반응하는 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (172, "경제 사이에 있는 서로의 일치현상을 뜻하는 단어는?", "동조", "디커플링( 탈동조화)", "커플링", "디커플링(탈동조화)", "보통 한 나라의 경제는 그 나라와 관련 있는 다른 나라의 경제 상황과 비슷하게 흘러갑니다. 서로 무역과 투자를 하며 연결돼 있기 때문에 한 나라에서 너무 큰 변화가 일어나면 다른 나라도 어느 정도 그 변화에 따라가는 거예요. 이런 흐름을 커플링( 동조) 현상이라고 합니다. 우리나라의 주요 교역국인 중국 경기가 좋으면 우리나라의 경기도 활발해지는 것이 자연스러운 동조의 예시입니다. 인위적인 동조화의 예시로는 미국처럼 기축통화를 가진 나라가 금리를 올리면 우리나라도 정책적으로 금리를 올리는 것이 있어요. 반대로 디커플링(탈동조화)은 부작용을 감수하고 독자적인 경제정책을 운영하거나, 어떤 계기로 서로 연관성이 옅어지는 현상이에요.", -"MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (173, "자산배분 현황을 한눈에 보여주는 포트폴리오 관리 방법은?", "투자분석", "리밸런싱 (Relabeling)", "포트폴리오조정", "리밸런싱", "포트폴리오는 자산배분 현황을 한눈에 보여줍니다. 리밸런싱은 포트폴리오를 주기적으로 점검해서 나의 자산배분 목표에 맞게 다시 밸런스를 잡아 주는 거예요. 돈관리를 건강한 몸 만들기로 비유해 볼게요. 가계부를 작성하는 건 내가 섭취하고 소비하는 칼로리를 기록하는 과정이고, 리밸런싱은 주기적으로 인바디를 체크해서 몸의 상태를 점검하는 거라고 볼 수 있어요.", "MUL", 1000000, 100000, FALSE); - -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (174, "리베이트의 실제 의미는?", "불법적인 마케팅", "판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’", "소비자 가격을 올리는 행위", "판매장려금’이나 ‘구매사례금’, 또는 ‘환급금’", -"리베이트(rebate)는 프로모션의 한 종류입니다. 리베이트는 큰 금액이 오가는 기업과 기업 사이 (B2B) 거래에 빈번하게 일어나는 관행이에요. 쉽게 말해 ‘판매장려금’이나 ‘구매사례금’, 또는 ‘ 환급금’이라고 할 수 있죠. 예를 들어, A 회사가 1000만 원짜리 기계 10개를 B 회사에 판매하고 1억 원을 받은 다음, 판매 금액의 10%인 1000만 원을 다시 B 회사에 돌려주는 것이 바로 리베이트예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (175, "리볼빙이란 카드 대금을 갚는 세 가지 방식 중 하나입니다. 이 방식의 특징은 무엇입니까?", "부분납액", "일부 금액이 월약정으로 결정됩니다.", "완납액", "일부 금액이 월약정으로 결정됩니다.", "리볼빙은 카드대금을 갚는 세 가지 방식 중 하나예요. ‘일부 금액’은 비율 (%)로 결정됩니다. 이번 달에 갚을 총금액이 100만 원이고 리볼빙의 결제 비율을 10%로 설정한 -경우를 가정해 볼게요. 이번 달에 낼 결제대금은 100만 원의 10%, 10만 원입니다. 나머지 90만 원은 다음 달로 넘어가요. 여기에 함정이 있습니다. 이번 달만이 아니라, 다음 달에도 전체 결제대금의 10% 만 결제되고 나머지 90%는 다음 달로 넘어갑니다. 그다음 달에도 마찬가지예요. 문제는 갚아야 하는 원금에 ‘지난달에서 넘어온 돈’만이 아니라 ‘이번 달에 소비한 돈’까지 들어간다는 점이에요. 이게 반복되면 결제 대금이 눈덩이처럼 늘어나요. 게다가 리볼빙의 평균 대출금리는 10~15%에 달합니다. 당장은 결제대금에 대한 부담을 줄일 수 있지만, 순식간에 대출잔액이 늘어날 수 있는 고금리 대출상품이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (176, "부동산 자산을 묶어둔 투자상품으로, 투자자들이 돈을 모아 부동산에 투자하고 임대료·매각 차익 등 수익을 배당으로 돌려주는 방식은?", "일반 펀드", "리츠", "주식투자", "리츠", -"리츠는 다양한 부동산 자산을 묶어둔 투자상품입니다. 투자자들의 돈을 모아 부동산에 투자하고, 임대료·매각 차익 등 수익을 배당으로 돌려주는 방식이에요. 리츠를 통해 적은 돈으로도 부동산 시장에 투자할 수 있어요. 이 중 주식시장에 상장된 리츠를 ‘공모 리츠’라고 합니다. 리츠도 일반 기업이 주식시장에 상장될 때 밟는 과정을 똑같이 거쳐요. 리츠 투자로 얻을 수 있는 수익은 크게 두 가지가 있습니다. 리츠를 낮은 가격에 사서 비싼 가격으로 팔아서 얻는 시세차익과 배당금을 받는 배당 수익이에요. 리츠는 배당 수익에 무게가 쏠려있는 투자상품이에요. 매년 배당가능이익의 90% 이상을 의무적으로 배당하고 있어서, 주주들에게 높은 배당금을 지급하는 걸로 유명합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (177, "신용대출의 방법 중 하나는 무엇입니까?", "신용카드", "마이너스통장", " 파워트레이딩", "마이너스통장", "마이너스통장은 신용대출의 방법 중 하나예요. 일단 부동산 같은 담보를 걸어놓지 않고 오직 내 신용만을 믿고! 약속한 한도만큼의 돈을 빌려주는 게 신용대출입니다. 신용대출에도 종류가 있습니다. 대출을 받을 때 빌리는 방식을 선택할 수 있어요. 건별로 한 번에 얼마씩 빌리는 방법이 있고 한도 내에서 통장에서 필요할 때 찾아 쓰는 방식이 있습니다. 건별로 -빌리는 건 그대로 신용대출이라 불러요. 이 중 한도 내에서 통장에서 필요할 때 찾아쓰는 방식을 -활용한 상품을 마이너스통장이라 부르죠.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (178, "증권사에서 상장 기업의 주식에 대한 의견과 목표 주가를 발표할 때, 주식을 팔지 (Sell) 할 것을 내놓는 경우는?", "목표 주가", "팔자(Sell)", "거의 없습니다", "거의 없습니다", "증권사에서는 보고서로 상장 기업의 주식에 대한 의견과 목표 주가를 발표합니다. 기업의 이익 전망치를 고려해, 해당 기업의 주식을 살지(Buy), 팔지(Sell), 그대로 있을지, 비중을 확대할지, 비중을 축소할지 등의 의견을 내고 가까운 미래에 도달할 것으로 예상하는 목표 주가를 제시해요. 증권사 보고서는 의견과 목표 주가에 대한 이유를 중심으로 참고하는 게 좋습니다. 우리나라 증권사는 ‘팔자(Sell)’ 의견을 거의 내놓지 않고, 목표 주가도 높게 잡는 경향이 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (179, "물건을 여러 부분으로 나누어 가치있는 물질로 분리하는 작업을 뜻하는 단어는?", " 합병", "물적분할", "증식", "물적분할", "물적 분할은 ‘기업 분할’의 한 종류입니다. 기업 분할은 말 그대로 기업을 나누어서 가른다는 뜻이에요. -\n물적 분할은 어떤 기업(모기업)이 특정 사업부를 독립적인 회사(자회사)로 분리하면서, 모회사가 - -자회사의 지분 100%를 소유하는 걸 뜻해요. 기존에 모회사 투자자에게 자회사 주식이 돌아가지 않아요. \n자회사로 독립한 (구)사업부 때문에 모기업에 투자했던 투자자에게는 참 아쉬운 상황이에요. 직접적인 관련 없이 건너건너 아는 사이가 된 거니까요. -\n만약 자회사가 주식시장에 상장한다면? 모기업에 투자했던 투자자 입장에서는 배신감이 들 수밖에 없어요. 그동안 열심히 투자금을 보태왔더니, 알짜 사업을 갖고 따로 상장해버리는 거니까요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (180, "주가가 꾸준히 오르다가 갑자기 큰 폭으로 하락하는 경우를 말할 때 사용하는 경제적 용어는?", "급락", "반락", "대폭락", "반락", "영어로는 ‘a reactionary fall’로 주가가 잘 오르다 말고 갑자기 큰 폭으로 하락하는 현상을 뜻해요. 눌렀을 때 튀어 오른다는 뜻인 ‘반발’의 반대 의미라고 볼 수 있어요. ‘급락’과는 다릅니다. ‘주가가 크게 떨어졌다’는 상황 자체를 강조할 때는 급락을, ‘주가가 계속해서 오르고 있었다가 갑자기 떨어졌다’는 현상을 강조할 때는 ‘반락’을 사용해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (181, "전 세계를 상대로 유가증권을 인수하고, 글로벌 기업 M&A 자문을 하며, 기업과 정부의 자금 조달을 주선하는 투자은행을 말하는 약자는?", "인수합병", "벌지 브래킷", "장기자금", -"벌지 브래킷", "전 세계를 상대로 1 채권이나 주식 같은 유가증권을 인수하고 2 글로벌 기업 M&A(인수합병) 자문을 하기도 하며 3 기업과 정부의 자금 조달을 주선하고 중개하는 등 투자은행이 할 수 있는 거의 모든 일을 하는 초거대 일류 투자은행을 말합니다. 투자은행은 장기적인 산업 자금을 담당하며, 개인은 상대하지 않습니다. ( ) 투자은행 중 벌지 브래킷은 약자로 ‘BB’라고 부르기도 해요. 현재 전 세계에 딱 아홉 개의 투자은행이 BB입니다. 바로 JP모건, 골드만삭스, 모건스탠리, 뱅크오브아메리카 메릴린치, 씨티그룹, 크레디트스위스, 바클리즈은행, 도이체방크, UBS예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (182, "베이지북이란 어떤 것을 의미하는 단어인가?", "트렌딩", "베이지북", "스타트업", -"베이지북", "미국 연방준비제도이사회(연준)는 매년 8회 ‘베이지북’을 공개합니다. -\n연준 산하의 12개 지역 연방준비은행이 각 지역경제를 조사 및 분석한 보고서예요. 일종의 미국 경제 최신 동향 보고서라고 볼 수 있어요. 미국의 경제 현황을 파악하는 데 중요한 기준이 되기 때문에 눈여겨볼 필요가 있어요. -\n참고로 원래는 표지가 빨간색이라서 ‘레드북’이라고 불렸는데요. 일반인에게 공개되기 시작하면서 표지는 베이지색으로, 이름은 ‘베이지북’으로 바뀌어 불리게 됐답니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (183, "금융시장에서 수익률을 정할 때 기준이 되는 것은 무엇일까요?", "목표수익", " 벤치마크", "금리", "벤치마크", "기준점 또는 표준을 의미합니다. 원래는 토목공학에서 토지 높이를 잴 때 기준점을 의미하는 용어였는데, 지금은 IT에서 성능 테스트를 할 때나 금융시장에서 목표 수익률을 정할 때도 활용하고 있어요. 금융에서 벤치마크 금리라고 하면 수익률의 기준이 됩니다. 미국 국채 10년물은 가계대출과 기업대출 등 다른 금융상품과 연동이 되어 있기 때문에 자주 시장의 벤치마크가 돼요. 미국 국채 10년물 금리를 기준으로 시장을 판단하겠다는 거예요. 개인 투자를 할 때도 활용할 수 있어요. 현재 주택담보대출 금리를 벤치마크 금리로 삼겠다고 하면, 현재 주택담보대출 금리보다는 더 벌어야 제대로 수익을 냈다는 의미예요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (184, "Variable interest rate의 뜻은 무엇입니까?", "고정금리", "변동금리", " 예수금", "변동금리", "빌리는 금액이 많고 갚는 기간이 긴 대출은 지금 빌린 돈의 가치가 나중에 어떻게 될지 알 수가 없습니다. -\n미래의 상황에 유연~하게 대응하기 위해, 대출금리가 기준금리의 움직임을 반영해 변하기도 해요. 이런 방식을 두고 ‘변동금리’라고 합니다. -\n‘고정금리’는 처음 대출상품에 가입할 때 정해놓은 금리 그대로 적용받는 방식입니다. -\n요즘에는 고정금리와 변동금리를 결합한 혼합금리 대출도 많이 나와 있어요. 일정 기간 고정금리를 적용받다가, 변동금리로 바뀌는 방식이에요. -\n일반적으로 같은 대출상품이더라도 변동금리가 고정금리보다 낮게 책정돼있습니다. -\n그런데 요즘 같은 금리 인상기에는 고정금리를 찾는 분들이 많아져요. 변동금리를 택할 경우, 기준금리가 오를 때 부담이 커질 수 있기 때문에 당장 금리가 높더라도 고정금리를 택하는 거예요.", "MUL", 1000000, 100000, FALSE); - -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (185, "‘주식매도제한’을 실현하기 위한 장치 중 하나는?", "포화가입", "보호예수", " 사기", "보호예수", "보호예수(保護預受)는 ‘보호하다(보호) + 맡기다(예) + 받다(수)’로 구성된 한자어입니다. 여기서 ‘예수’는 귀중품, 유가증권 등 어떤 것(주로 가치 있는 것)을 금융회사가 보관하는 것을 뜻해요. -\n우리나라 증권시장에는 어떤 요건에 해당하는 주주가 일정 기간 동안 보유한 주식을 사고 팔지 못하게 제한하는 ‘주식매도제한(Lock up)’이 있습니다. -\n보호예수는 ‘주식매도제한’을 실현하기 위한 장치 중 하나입니다. 기업의 주식을 많이 가진 최대주주 또는 특수관계인(투자자 등)이 일정 기간 주식을 매도하지 않도록 일시적으로 제한하는 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (186, "민간택지 분양가를 정하는 제도는?", "국토정비사업", "분양가상한제", " 주택보금자리", "분양가상한제", "분양가상한제는 분양가에 상한선을 정한 제도입니다. 분양가상한제는 1977년 처음 도입된 후에 폐지와 부활을 반복했는데요. 2020년 7월 29일부터 시행된 분양가 상한제의 정식 명칭은 ‘민간택지 분양가상한제’입니다. 초기 분양가상한제는 공공택지에만 적용됐다가 2007년에 처음으로 민간택지에도 도입됐어요. 도입 이후 주택공급이 위축되면서 분양가상한제가 적용되는 민간택지의 요건을 강화해 제도가 흐지부지된 적이 있었는데요. 2020년부터 적용대상과 기준을 개정한 민간택지 분양가상한제를 시행했습니다. 2007년에 시행될 때는 전국에 동시 적용하는 제도였지만, 2020년부터 새롭게 적용된 민간택지 분양가상한제는 ‘투기과열지구’에만 적용됐습니다. 민간택지의 분양가상한가격은 ‘택지비+건축비’로 산정됩니다. 여기에 2022년 6·21 부동산대책으로 주거이전비, 손실보상비 등 추진과정에서 필수적인 요인의 합리적인 반영분과 자재가격 급등 반영분이 추가되었어요. 여기서 관건은 ‘택지비’입니다. 택지비는 시세가 아니라 감정평가액을 기준으로 하기 때문에 주변 땅값 시세보다 낮게 나와요. 택지비 감정평가액의 객관성도 중요한데요. 6·21 부동산대책으로 외부 검증위원회를 신설하는 규정이 생겼습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (187, "인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데, 노동조합이 반발하여 사람들은 어느 편도 들지 않았던 영국의 정치현상은?", "영국 경제 위기", "불만의 겨울", "노조 분쟁", "불만의 겨울", "불만의 겨울은 1978~1979년 영국에서 일어났던 정치현상이에요. 당시 영국 정부는 인플레이션을 억제하기 위해 임금 인상률 상한제를 도입했는데, 노동조합이 크게 반발했습니다. 정부와 노조의 대립은 극단적으로 심해졌고, 사람들은 어느 편도 들지 않았어요. 이 현상은 정권이 바뀌며 마거릿 대처가 총리로 등장하는 데 영향을 주었어요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (188, "금융상품을 판매할 때 소비자에게 정확한 정보를 제공하지 않은 경우를 말하는 단어는?", "위약서", "불완전판매", "과소광고", "불완전판매", "은행, 증권사, 보험사 등 금융회사가 소비자에게 금융상품을 판매하는 과정에서, 반드시 지켜야 할 사항을 누락했거나 정보를 허위, 과장해서 소비자가 상품에 대해 잘못 인식하도록 판매한 사례를 뜻합니다. 원금 손실이 발생하는 금융 상품을 판매할 때, 은행은 고객에게 원금 손실이 발생한다는 사실을 고지하지 않았거나, ‘절대 손해보지 않는 안전자산’이라고 설명하는 식입니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (189, "운송 수요나 운임이 급감할 때 피해를 최소화하기 위해 취소하는 것을 뜻하는 단어는?", "트래싱", "지연 출항", "운송 중단", "블랭크 세일링", "블랭크 세일링(Blank Sailing)은 화물선 임시결항으로, 운송 수요나 운임이 급감할 때 피해를 최소화하려고 예정된 운항 전체나 특정 항구 정박을 취소하는 것을 뜻해요. 블랭크 세일링이 발생하면 개별 회사나 개인 소비자는 주문한 상품이 배송되기까지 더 많은 시간을 기다려야 할 수 있습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (190, "블록 경제는 어떤 경제 시스템을 말합니까?", "자유무역 체제", "블록 경제", " 지배경제", "블록 경제", "정치적, 경제적으로 관계가 깊거나 비슷한 문화를 가진 여러 국가가 결집해 ‘블록(block)’을 만드는 경제 시스템이에요. 블록 안에서는 서로 자유롭게 거래하는 반면, 블록 바깥 국가와는 거리를 두고 장벽을 쌓곤 합니다. 블록 경제는 식민지를 이용한 경제시스템이 돌아가던 18~19 세기와, 1920~1930년대 대공황 이후 미·소 냉전 시절에 등장한 적이 있습니다. 현재 코로나19 -팬데믹 이후 글로벌 공급망을 재편하면서 다시 경제가 블록화되고 있어요. 대체로 러시아와 중국을 한 - -블록으로 묶고, 미국을 중심으로 한 국가를 한 블록으로 묶습니다. 인도나 동남아시아는 어디에도 끼지 않고 실리를 챙기려는 움직임을 보이고 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (191, "취업하고 싶어도 일할 수 있는 능력이 없는 사람, 전업주부, 군인 등이 속하는 인구를 뜻하는 단어는?", "실업자", "비경제활동인구", "취직자", "비경제활동인구", "만 15세가 넘은 인구 가운데 취업자도 실업자도 아닌 사람을 뜻해요. 취직할 의사가 없고 구직활동을 하지도 않는 사람이 비경제활동인구에 속합니다. 실업자는 취업할 의지가 있고, 실제로 구직활동을 하는데도 취직하지 못하고 있는 사람이에요. 비경제활동인구는 일을 하고 싶어도 일할 수 있는 능력이 없는 사람도 포함해요. 또, 전업주부나 군인, 학생 등도 비경제활동인구에 속합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (192, "경제 시스템에서 특정 집단의 이익을 우선하는 정치적·경제적 견해를 말할 때 -사용되는 단어는?", "자본론", "비둘기파", "노동당", "비둘기파", "경제정책을 이야기할 때, 종종 ‘비둘기’와 ‘매’가 등장하곤 합니다. -\n‘비둘기파’는 경기 부양을 위해 금리를 낮추고 시장에 돈을 푸는 양적완화를 주장하는 사람을 뜻하고, -‘매파’는 경기 과열을 막고 물가를 안정시키기 위해 금리를 높여야 한다고 주장하는 사람들 뜻해요. \nFOMC 파월 의장은 비둘기파와 매파의 중간인 ‘올빼미파’로 불립니다. 비둘기 혹은 매, 둘 중 하나로 치우쳐지지 않는 새로운 성향을 의미한다고 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (193, "기준금리를 0.25%p 올릴 때는 일반적으로 어떻게 하지만, 이번에는 0.50%p 만큼 올렸습니다. 이러한 경우를 무엇이라고 부르나요?", "자이언트 스텝", "빅스텝", "세 단계 스텝", -"빅스텝", "보통은 기준금리를 올릴 때 0.25%p씩 올려요. 이번에는 0.25%p의 두 배인 0.50%p 만큼 올린 건데요. 이렇게 한꺼번에 두 단계를 올리는 것을 두고 ‘빅 스텝’이라고 불러요. 세 단계 (0.75%p)를 올릴 때는 ‘자이언트 스텝’이라고 표현합니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (194, "지구계획이 승인된 이후로 청약을 받는 제도는?", "예산집행", "사전청약", " 시장조사", "사전청약", "청약은 한자어로 ‘계약을 체결할 것을 요청하는 행위’를 뜻합니다. 새로 짓는 아파트를 분양 받을 권리(분양권)를 청약하는 것이 ‘주택청약’이에요. -\n청약은 보통 아파트 착공 후에 이루어집니다. 사전청약은 이보다 1~2년 이상 앞서서, 지구계획이 승인된 이후로 청약을 받는 제도예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (195, "산업활동동향이 나타내는 바를 알리는 것은?", "경쟁의 정도를 알 수 있습니다.", -"산업활동동향", "인건비의 비율을 알 수 있습니다.", "산업의 추세와 성장률을 알 수 있습니다.", -"산업활동동향은 각 산업부문별 성적표로 크게 생산, 소비, 투자, 경기로 나눠서 동향을 분석해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (196, "어떤 기업의 주식이 코스피, 코스닥, 코넥스와 같은 주식시장에서 거래되기 위해 해야 하는 것은?", "고가발행", "상장폐지", "거래중지", "상장폐지", "어떤 기업의 주식이 코스피, 코스닥, 코넥스와 같은 주식시장에서 거래되려면, 그 기업이 주식시장에 상장(上場)해야 해요. 한자 그대로 해석하면 ‘시장에 명패를 내건다’는 뜻입니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (197, "생산자물가지수를 측정하는 것은 무엇입니까?", "소비자물가지수", "생산자물가지수", "실질인구지수", "생산자물가지수를 측정하는 것은 물가상황을 파악하기 위해 사용되는 지표입니다.", -"생산자물가지수(Producer Price Index, PPI)는 생산자 입장에서 측정한 물가입니다. 생산자가 물건과 서비스를 만드는 데 사용하는 상품과 서비스의 평균가격이라는 뜻이에요. -\n생산자물가가 상승하면 소비자물가가 올라요. 다시 말해, 인플레이션으로 이어질 가능성이 커요. 특히 미국의 인플레이션은 전 세계 시장에 영향을 미치기 때문에 미국의 생산자물가와 소비자물가 관련 지표를 주목하곤 합니다. -\n미국이 자국 경기 상황이 과다한 인플레이션 국면에 접어들었다고 판단하면, 기준금리를 올릴 수 있습니다. 기준금리를 조정해 시장에 풀리는 돈의 양을 조절하는 방식으로 인플레이션을 가라앉히려고 하는 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, - -option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (198, "한 나라가 다른 나라와 경제적 거래를 나눈 결과 발생한 수입과 지출의 차이를 뜻하는 단어는?", "수입", "서비스 수지", "투자", "서비스 수지", "수지’는 한 나라가 다른 나라와 경제적 거래를 나눈 결과 발생한 수입과 지출을 뺐을 때 얼마인지 따져보는 거예요. 장사를 잘 해서 흑자를 보면 수지 흑자, 수입이 더 많아서 적자를 보면 수지 적자라고 합니다. 서비스 수지는 서비스를 사고 팔아 발생한 수입과 지출의 차이를 뜻해요. 서비스 수지에는 운수·여행·통신서비스·보험서비스·특허권 등 사용료·사업서비스·정부서비스·기타서비스 8개 항목이 포함됩니다. 우리나라 서비스 수지는 보통 적자예요. 해외 교육 서비스나 해외 여행, 해외 로열티 지급 등의 서비스 지출이 굉장히 많거든요.", -"MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (199, "선물·옵션 동시 만기일은?", "연초", "매년 3, 6, 9, 12월 세 번째 금요일", "6 월, 12월 첫 번째 목요일", "매년 3, 6, 9, 12월 세 번째 금요일", "매년 3, 6, 9, 12월 세 번째 금요일은 미국 증권시장의 선물·옵션 동시 만기일입니다. 우리나라 증권시장의 선물·옵션 동시 만기일은 매년 3, 6, 9, 12월 두 번째 목요일이에요. -\n미국의 경우, 선물 만기일은 3, 6, 9, 12월 세 번째 금요일이고 옵션 만기일은 매월 세 번째 금요일이에요. -\n선물과 옵션은 거래 기간이 정해져 있어요. 즉, 만기일이 있습니다. 만기일에 투자자는 1물건을 인도받거나 2만기일을 연장(롤오버)하거나 3청산해요. -\n3번의 경우, 선물과 옵션을 가진 투자자가 만기일에 매물을 청산하면 매도 물량이 평소보다 많이 나올 수 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (200, "물건을 미리 생산하거나 예약하여 시장가격이 상승할 때를 말하는 단어는?", "예금", "선물", "자산", "선물", "선(先) + 물건 물(物). 한자 뜻 그대로 미래의 특정 시점에 물건을 사고파는 약속을 의미합니다. -\n선물거래는 농산물 시장에서 시작됐어요. 배추, 쌀, 밀과 같은 농·축·수산물은 생산량에 따라 가격변동이 특히 심하기 때문에, 미래의 가격을 미리 정해주는 선물거래를 이용해 가격변동 위험을 줄이려 했어요. -\n선물거래에는 두 가지의 지불 방법이 있어요. 현물을 직접 거래하는 인수도결제가 있고요. 현물을 직접 거래하지 않고 차익만 거래하는 현금거래가 있습니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (201, "세금을 내기 전에 소득이 얼마나 줄어드는지 확인하는 과정은?", "세액공제", " 소득공제", "연말정산", "소득공제", "우리는 벌어들인 소득에 대한 세금을 내야 합니다. 세금은 소득을 신고할 때 내는데, 정부 정책 등으로 세금을 깎아주는 경우도 있어서 나중에 정산하는 절차가 필요해요. 직장인의 경우, 이 절차가 ‘연말정산’입니다. 세금을 깎아주는 방식은 크게 소득공제와 세액공제로 나뉩니다. 소득공제는 세금을 매기는 기준이 되는 ‘소득’을 덜어주는 것이고, 세액공제는 소득을 기준으로 계산한 ‘세금’에서 얼마간 덜어주는 것입니다. 연말정산을 할 때, 소득공제와 세액공제를 적용받고 난 ‘결정세액’을 계산합니다. 그리고 이 결정세액을 ‘내가 이미 낸 세금( 기납부세액)’과 비교해, 더 낸 만큼 돌려받거나 덜 낸 만큼 더 내요. ‘연말정산 이후 돈을 토해냈다’ 고 하는 경우, 결정세액이 기납부세액보다 컸다는 뜻이에요. 반대로 ‘13월의 월급을 받았다’라고 하는 경우는 결정세액이 기납부세액보다 작다는 뜻입니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (202, "물건을 판매하는 데 필요한 예측은?", "가격예측", "수요예측", "시장조사", " 수요예측", "수요예측은 공모주의 가격인 공모가를 결정하기 위해 수요상황을 파악하는 걸 말합니다. \n공모주: 기업이 상장할 때는 신주(새로운 주식)를 발행하고 신주의 주인을 공개적으로 모집하는 ‘ 공모’ 단계를 거칩니다. 이때의 신주를 ‘공모주’라고 해요. -\n공모가: 공모주에는 상장 전에 거래되던 주식 가격이 아닌 새롭게 책정된 가격, 즉 공모가를 적용해야 합니다. 공모가는 먼저 대표주관회사가 발행 주식의 공모희망가격(밴드)을 제시하는 걸로 기준이 정해집니다. -\n수요상황 파악: 증권사, 보험사, 국민연금 등 기관투자자에게 수요예측을 실시해 공모희망가격 구간 내에서 얼마의 가격에 몇 주를 사고 싶냐는 수요를 물어봅니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (203, "반도체 기업이 생산한 제품 중 결함이 없는 제품의 비율을 나타내는 단어는?", " 성과", "수율", "품질", "수율", "수율은 한자어예요. 무언가를 거둔다는 뜻의 ‘수(收)’, 비율 ‘율 - -(率)’로 이루어져 있습니다. 반도체에서 수율은 ‘결함이 없는 합격품의 비율’을 뜻해요. 웨이퍼 한 장에 들어갈 수 있는 칩의 최대 개수 중, 정상적으로 작동하는 칩의 개수를 나타냅니다. 반도체 기업에서 수율을 높이는 것은 굉장히 중요해요. 수율이 높아질수록, 같은 원자재를 투입해서 더 많은 합격품을 만들어낼 수 있으니까요. 삼성전자, SK하이닉스 등 우리나라의 주요 반도체 기업도 수율을 끌어올리기 위해 기술을 개발하고 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (204, "문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하는 방법을 무엇입니까?", "피싱", "스미싱", "트래싱", "스미싱", "스미싱(Smishing)은 ‘문자메시지(SMS)’와 ‘피싱(Phishing)’을 합친 단어예요. 문자메시지에 악성 앱 주소를 넣어 대량으로 전송하는 방식으로 접근하는데요. 이후 악성 앱을 설치하거나 전화를 유도해 금융정보, 개인정보를 탈취하는 수법으로 사기에 이용해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (205, "주식을 저가에 살 수 있는 권리를 받은 후, 주가가 오르면 돈을 벌 수 있는 방법은?", -"인베스트먼트", "스톡옵션", "에이프티", "스톡옵션", "스톡옵션의 상법상 정식 명칭은 주식매수선택권입니다. 말 그대로 주식을 살지 말지 선택할 수 있는 권리라는 뜻인데요. ‘계약 당시에 정해놓은 가격’으로 살 수 있다는 게 엄청난 메리트입니다. 현재 주가가 올랐더라도, 싼 가격에 주식을 살 수 있다면 시세차익으로 돈을 벌 수 있으니까요. 대신 조건이 있습니다. 상법상, 스톡옵션은 회사에서 부여받은 시점을 기준으로 2년 이상 재직해야 행사할 수 있어요. 예를 들어볼게요. 독자님이 ‘어피티 주식을 1만 원에 살 수 있는 스톡옵션’을 받았습니다. 2년 뒤, 어피티가 폭풍 성장해서 주식 가격이 3만 원으로 올랐더라도 독자님은 주식을 1만 원으로 살 수 있어요. 그럼 독자님은 시세보다 훨씬 싸게 주1식을 사고, 다시 시세에 맞게 주식을 팔아서 그 차익으로 돈을 벌 수 있겠죠? 물론, 주식을 싸게 산 뒤에도 앞으로 더 오를 거라고 생각하면 계속 보유할 수 있습니다. 얻는 게 돈뿐만은 아닙니다. 최소한 스톡옵션에 기재된 권리 행사 시점까지는 열심히 일할 동기부여가 될 테니까요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (206, "기업 인수를 목적으로 하는 기업을 뜻하는 단어는?", "투자회사", "스팩", "채권", -"스팩", "스팩(SPAC)은 ‘Special Purpose Acquisition Company’의 줄임말이에요. 그대로 번역하면, ‘기업 인수를 목적으로 하는 기업’을 뜻합니다. -\n스팩이 먼저 주식시장에 상장한 뒤, 상장하지 않은 상태의 기업(비상장기업)을 인수합니다. \n스팩은 ‘긁지 않은 복권’이라고 부르기도 해요. 어느 회사를 인수할지 정해지지 않은 상태에서 공모에 들어가기 때문이에요. -\n스팩이 특정 회사를 인수한다는 설이 돌면 스팩의 주가가 크게 뛰곤 합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (207, "기업을 대량으로 합병하여 경쟁력을 강화하는 조직 변화는?", "메가머저", " 스팩합병", "인수합병", "스팩합병", "스팩(SPAC, Special Purpose Acquisition Company)은 -기업 인수를 목적으로 상장하는 종목입니다. 비상장 회사와 법적으로 합치는 데 필요한 페이퍼 회사예요. -\n투자자들이 돈을 모아 스팩을 주식시장에 상장시킨 뒤 비상장 회사와 합병하고 합병된 기업이 상장회사가 됩니다. 이를 ‘스팩합병’을 통한 상장이라고 해요. -\n지난해 1분기까지 미국에서 스팩 상장은 일반적인 기업공개(IPO) 상장보다 훨씬 쉬웠어요. 하지만 스팩 투자가 과열되자, 미국 당국이 기준을 까다롭게 바꿨습니다. 스팩 투자 열기가 다소 식으면서 미국 스팩에 투자한 우리나라 개인 투자자들이 손해를 보기도 했어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (208, "외국에서 물건을 저가에 대량으로 사다시피 하는 데 사용되는 거래 방식을 말하는 단어는?", "무역", "시간외거래", "무역수석", "시간외거래", "미국 주식 거래 시간은 우리나라 기준으로 오후 11시 30분부터 오전 6시까지입니다. -\n썸머타임(3월 중순~11월 초)에는 거래시간이 1시간씩 앞당겨져요. 우리나라 -\n시간 기준으로 오후 10시 30분부터 오전 5시 사이에 거래할 수 있습니다. -\n국내 주식처럼 미국 시장도 장전, 장후 시간외거래를 할 수 있는데요. 단, 시간외거래가 가능한 프리마켓(pre-market)과 애프터마켓(after-market)의 시간은 증권사마다 차이가 있습니다. \n대부분의 국내 증권사 앱에서는 실시간 시세가 아닌, 15분 지연된 시세를 보여줍니다. 실시간 시세를 보여주는 별도의 앱이나 웹에서 정보를 얻어야 해요.", "MUL", 1000000, 100000, FALSE); - -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (209, "기업의 재무 situation을 분석하여 그 신뢰도를 판정하는 것은?", "자금 조달", -"상품 가격 결정", "투자 심사", "신용평가", "개인의 신용도를 평가하는 곳은 크게 두 종류가 있습니다. 하나는 NICE 평가정보, KCB, SCI평가정보와 같은 신용평가사. 다른 하나는 은행, 카드사, 보험사와 같은 금융회사예요. -\n금융회사는 고객이 신규로 금융상품에 가입하거나 이용할 때 신용을 평가합니다. 평가정보를 -바탕으로 ‘상품에 가입할 자격이 되는지’, ‘지금 조건대로 이 상품을 계속 이용할 수 있을지’를 판단해요. -\n금융회사와 신용평가사는 신용정보에 대한 모든 걸 관리 및 수집하고 전달하는 비영리 사단법인인 ‘신용정보원’으로부터 신용정보를 가져옵니다. 이 데이터를 갖고 각 회사의 자체 신용평가모델로 평가해요. -\n‘어디에서 신용등급을 조회하는지’, ‘어떤 은행에서 대출심사를 받는지’에 따라 신용등급과 대출금리, -대출한도가 다르게 나오는 이유가 이것 때문입니다. 같은 사람, 같은 신용정보라고 해도 ‘어디에서 평가하는지’에 따라 적용되는 신용평가모델이 다르니 결과가 다르게 나오는 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (210, "“경제활동인구” 중에서 ‘실업자’가 차지하는 비율을 뜻하는 단어는?", "고용률", " 실업률", "취업률", "실업률", "실업률은 ‘경제활동인구’ 중에서 ‘실업자’가 차지하는 비율을 말해요. 경제활동인구는 ‘만 15세 이상 만 60세 미만 인구 중 경제활동 의사가 있는 사람’의 수예요. 쉽게 말해, 일할 의사가 있지만 직장을 찾지 못한 사람들의 비율이 실업률입니다. 반면 고용률은 경제활동인구든 비경제활동인구든 상관없이 ‘만15세 이상 64세 미만 생산가능인구 중 취업자가 차지하는 비율’을 말해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (211, "실적이란 무엇을 의미하는가?", "예상 수요", "실제 성과", "시장 가치", "실제 성과", "기업들의 실적은 분기별로 발표되는 분기보고서, 연간으로 발표되는 사업보고서에서 확인할 수 있어요. 보고서에서 핵심은 ‘재무제표’입니다. -\n4분기 보고서를 제외하고는 모두 각 분기가 마감되는 날짜로부터 45일 이내로 분기 보고서를 제출해야 해요. -\n연초에는 전년도 사업 실적을 ‘사업보고서’로 발표하고, 외부 감사를 받은 뒤 ‘감사보고서’를 제출하는 일정 때문에 굉장히 바쁩니다. 그래서 4분기 보고서는 제출 기한을 두 배(90일)로 줘요. \n2분기 실적의 경우, 1년의 반이 지난 시점에 발표되는 실적 보고서라서 ‘반기보고서’라고도 불립니다", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (212, "기업이 분기별로 실적을 발표할 때, 시장의 기대에 못 미치는 수준으로 실적이 낮게 나오면 “어싱”이라 하는 것은?", "어닝서프라이즈", "어닝쇼크", "경영위기", "어닝쇼크", "‘어닝 (earning)’은 수입, 벌이라고 이해하면 돼요. 기업이 분기별로 실적을 발표할 때, 시장의 기대 이상으로 실적이 좋게 나오면 ‘어닝 서프라이즈’, 기대에 못 미치는 수준으로 실적이 낮게 나오면 ‘ 어닝 쇼크’라고 표현해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (213, "역직구는 무엇을 의미할까요?", "직접 판매", "역직구", "소비자 보호", "역직구", -"우리나라 소비자들이 해외 온라인 쇼핑몰에서 직접 물건을 구입해 들여오는 행위를 직접 구매(직구) 라고 합니다. 우리나라에 정식 유통되는 상품보다 저렴하거나, 우리나라에 유통되지 않는 물건을 구매할 수 있는 장점과 관세 등 행정처리를 직접 해야 하는 불편함이 있어요. 역직구는 우리나라에서 구입할 -수 있는 상품을 외국 소비자에게 직접 판매하는 거예요. 역직구 플랫폼에 입점해 셀러가 된 다음, 내가 직접 상품을 골라 판매합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (214, "월정액을 정하여 지속적으로 저축하는 계좌를 말하는 단어는?", "은행대출", " 연금저축계좌", "투자신탁", "연금저축계좌", "개인연금의 대표 상품으로는 연금저축신탁(은행), 연금저축보험(보험사), 연금저축펀드(증권사)가 있는데, 이 세 가지를 묶어 ‘연금저축계좌’라고 불러요. \n그리고 IRP, 퇴직연금 DC형, 연금저축신탁, 연금저축보험, 연금저축펀드를 묶어 ‘연금계좌’라고 부릅니다. -\n연금계좌는 국민들의 노후 자금 형성을 독려하기 위한 목적이지만, 투자자들에게 큰 절세 효과도 -주고 있습니다. - -\n원금을 지키는 목적이 크다면 연금저축신탁 또는 연금저축보험을, 적극적인 운용을 원한다면 연금저축펀드를 선택하는 것이 좋습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (215, "운송 수단의 가격을 저렴하게 조정하여 물품 배송 비용을 줄이는 방식을 말하는 단어는?", "자율화", "연료비 연동제", "물류 최적화", "연료비 연동제", "연료비 연동제는 3 개월마다 석탄, 석유, 액화천연가스(LNG) 등 연료 가격의 변동분을 전기요금에 반영하는 제도입니다. \n발전소에서 전기를 생산할 때 필요한 석탄, 석유 등 연료의 가격은 수요와 공급에 따라 그때그때 달라요. -\n연료비 연동제를 적용하면 연료 수입 비용이 저렴할 때는 전기요금이 낮아지고, 비용이 오르면 전기요금이 높아져요. -\n한국전력은 연료비 상승으로 전기요금에 대한 부담이 갑자기 커지지 않도록 요금 상승 폭을 조절하고 있어요. 다만 요금을 인상하지 않으면 한국전력의 적자가 더 커진다는 점도 고려할 요소입니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (216, "기업의 경영을 통해 얻는 수익을 계산하려면 무엇을 차감해야 하나?", "재무제표", -"사업수입", "경쟁자 분석", "영업이익", "매출액 = 판매량 X 가격 -\n만약에 어피티가 1만 원짜리 다이어리를 만들어서 100권을 팔았다면, 이렇게 번 돈 100만 원(1만 원 X 100권)을 ‘매출액’이라고 해요. ‘제품 판매량’에 ‘판매가격’을 곱한 것을 의미합니다. \n매출총이익 = 매출액-매출원가 -\n어피티가 다이어리 1권을 만드는 데 들어간 비용(재료비, 인건비, 인쇄비 등)이 3천 원이라고 해볼게요. 총 100권을 팔았으니, 30만 원(3천 원 X 100권)의 비용이 들었겠죠? 손익계산서에서는 이걸 ‘매출원가’라고 합니다. 매출액에서 매출원가를 뺀 금액은 ‘매출총이익’이라고 해요. -\n 판관비 -\n제품(서비스)을 만들었으면 팔기 위해서 제품을 널리 알려야 합니다. 그러려면 기획홍보 담당자( 인건비)도 필요하고, 광고비(판매비)도 들고, 기타 비용(일반 관리비) 등을 지출할 거예요. 이렇게 기업의 판매와 관리, 유지할 때 발생하는 비용을 ‘판관비’라고 불러요. -\n영업이익 = 매출총이익-판관비 -\n‘매출총이익’에서 판관비(판매비, 관리비)를 빼면 ‘영업이익’이 됩니다. 영업이익은 회사가 영업을 통해 얼마를 벌었는지 보여주는 지표이기 때문에 굉장히 중요합니다. 영업이익이 커지면 기업이 경영을 잘했다는 뜻이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (217, "금융회사가 망하면 돈을 돌려받을 수 있는 최대 금액은 얼마입니까?", "2천만 원", -"예금자보호법 5천만 원", "10천만 원", "예금자보호법 5천만 원", "예금자보호법은 내가 돈을 맡긴 금융회사가 망하더라도 원금과 이자를 합해 한 은행당 1인당 최고 5천만 원까지 예금보험공사에서 보호해주는(=돌려받을 수 있는) 법입니다. 금융회사 한 곳이 기준이기 때문에 하나의 한 기관당 5천만 원씩, 여러 곳에 돈을 나눠놓으면 모두 보호받을 수 있어요. 대신, 돈을 ‘즉시’ 돌려받지 못할 수도 있습니다. 금융회사가 망한다는 건 돈을 맡긴 예금자들에게 돌려줄 돈이 없다는 뜻이니까요. 그래도 예금보험공사에서 보장해주기 때문에 최대 6개월 내에는 돌려받을 수 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (218, "은행의 주요 수익모델 중 하나는?", "투자 이익", "예대마진", "이자 이익", " 예대마진", "예대마진(預貸margin)은 예금할 때 ‘예’, 대출할 때 ‘대’, 마진은 ‘차액으로 남긴 이 윤’을 뜻합니다. 대출이자로 얻은 수입과 예금금리로 나간 지출의 차액으로 남긴 마진이라는 뜻이에요. 예대마진은 은행의 주요 수익모델입니다. 은행 상품을 보면, 대출금리가 예금금리보다 높아요. 이 차이만큼 은행이 마진을 가져가는 거예요. 이자를 통해 남기는 이익이기 때문에 예대마진을 다른 말로 ‘이자 이익’이라고도 부르는데요. 우리나라 은행은 이자 이익이 전체 수익원의 80% 이상이에요. 다른 나라 은행과 비교해보면 굉장히 큰 비중을 차지하는 편이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (219, "외자판호는 한국 게임이 중국에 출시될 때 필요한 무엇을 의미합니까?", "콘텐츠 허가", "외자판호", "중화권 매출", "외자판호", "외자판호는 외국 게임이 중국에 출시될 때 필요한 인허가권입니다. 이 이슈를 이해하려면 2016년으로 시간을 돌려봐야 해요. 지난 2016년, 한국의 사드 배치 발표로 중국 정부는 ‘한한령(중국 내 한류 금지령)’을 내리게 됩니다. 중국인 관광객들의 한국 방문을 통제하거나 한국 상품 수입을 규제하는 등 다양한 방식으로 압박해왔죠. 콘텐츠 전반에 한한령이 - -적용되면서, 국내 게임시장도 시련을 겪게 됩니다. 중국에 게임을 서비스하고, 수익활동을 하려면 ‘ 외자판호’가 필요한데 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임시장에서 중화권 매출이 절반 이상을 차지했습니다. 2020년부터는 조금씩 외자판호를 발급받는 사례가 나오기 시작했습니다. 하지만 여전히 희귀한 수준이라서, 외자판호 발급에 성공한 게임사의 주가는 급등세를 보이곤 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (220, "정부가 중앙은행이나 다른 나라의 국립은행에 넣어둔, 외국 돈으로 된 자산의 총 가치를 ‘__________’이라고 부른다.", "국제수지 적자 보전", "외환보유액", "국민연금", " 외환보유액", "개인이 은행에 돈을 저축하고, 회사가 이익금에 자본을 쌓는 것처럼 정부도 여유자금을 저장해 둡니다. 그중에서도 정부가 중앙은행이나 다른 나라의 국립은행에 넣어둔, 외국 돈으로 된 자산의 총 가치를 ‘외환보유액’이라고 불러요. 정부가 여유자금으로 갖고 있는 외화는 달러, 유로화, 위안화, 엔화 등으로 국제무역에 자주 사용된다는 공통점이 있습니다. 외환보유액의 목적은 크게 네 가지예요. 1 국제무역에서 적자가 날 경우, 그만큼 채우고(국제수지 적자 보전) 2 외국에서 빌려온 돈의 원리금을 갚고 3 환율이 너무 떨어지거나 올라가면 외환시장에 개입해 방어하고 4 우리나라에 투자하려는 개인과 회사에 신용도를 쌓는 것이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (221, "은행에서 정한 금리를 기준으로 추가로 금리 더하거나 빼서 조정할 수 있는 금리는?", "예금금리", "우대금리", "대출금리", "우대금리", "우대금리는 가감조정금리라고도 부릅니다. 은행에서 정한 금리를 기준으로 추가로 금리 더하거나(가), 빼서(감) 조정할 수 있는 금리거든요. 은행과 같은 계열의 카드사에서 카드를 만들거나 은행 계좌에서 공과금을 납부하는 등 조건을 맞추면 우대금리를 제공합니다. 예금금리를 연 0.1% 인상해주거나 대출금리를 연 0.2% 내리는 식이에요. 특판 적금, 대출 상품을 자세히 살펴보면 우대금리를 적용해서 ‘최대’, ‘~부터’ 같은 단어가 붙어있습니다. 적금은 이자를 많이 받을수록 좋으니 최대 금리를 적어놓고, 대출은 이자 부담이 적을수록 좋으니 최저 금리를 적어놓은 거예요. 브랜드 세일 광고에 최대 할인율을 적어두는 것처럼 고객 입장에서 최대 혜택을 받을 수 있는 금리를 보여주는 것과 비슷합니다.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (222, "임직원들이 좋은 조건에 주식을 살 수 있도록 혜택을 주는 제도는?", "상장제", " 우리사주", "퇴직금 지급", "우리사주", "‘우리사주’는 말 그대로 우리 회사의 주식입니다. 임직원들이 자기 회사 주식을 좋은 조건에 살 수 있도록 혜택을 주는 제도예요. 우리나라에서는 기업이 상장하거나 유상증자를 할 때 새로 발행하는 주식 물량의 20%를 우리사주조합에 배정하게 돼 있습니다. 상장이나 유상증자 직후, 주가가 엄청나게 상승하면 주식을 팔아 수익을 내겠다고 생각할 수 있는데요, 이러기가 힘듭니다. 우리사주는 보호예수가 적용되기 때문에 일정 기간 처분할 수 없어요. 보호예수 기간이라도 우리사주를 처분하는 방법이 있습니다. 퇴사하는 건데요. 퇴사하면 주식이 한 달 후에 들어와서 처분할 수 있어요. 실제로 시세 차익을 위해 임직원이 사표를 내기도 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (223, "투자에 대한 우선순위를 정할 때 가장 먼저 고려해야 하는 것은 무엇일까?", "채무", "우선주", "가치", "우선주", "우선주는 보통주에 비해서 특정한 우선권을 부여한 주식입니다. 일반적으로 거래하는 ‘보통주’ 뒤에 ‘우’를 붙여서 표현해요. ‘삼성중공업’은 보통주, ‘삼성중공업우’ 는 우선주. 이런 식이에요. -\n우선주의 큰 특징은 1 보통주와 달리 주주총회에서 의결권을 행사할 수 없다, 2 그 대신 -보통주보다 배당수익률이 높다, 3 ‘일반적으로’ 보통주보다 주가가 40% 정도 낮고, 발행 주식 수가 적다는 점입니다. -\n이 중 3이 우선주의 괴리율을 크게 올려놓곤 합니다. 이슈가 생겼을 때 보통주보다 우선주에 수요가 몰리면서 거래량이 크게 늘고, 주가가 급등하는 식이에요. 우선주 급등 현상이 꾸준히 연출되자, 한 증권사 리포트에서는 ‘비정상의 구조화’라고 표현했어요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (224, "월세로 거주하는 사람들에게 적용되는 세액 공제 중 하나는?", "소득세 공제", " 월세세액공제", "부동산세 공제", "월세세액공제", "1년 동안 받은 총 급여액이 7천만 원 이하에 월세로 거주하면서, 세부 조건을 만족시키면 월세액 세액공제를 받을 수 있습니다. 세액공제 금액 예를 들어 볼게요. 총 급여액 3천만 원에, 매달 50만 원의 월세를 낸 경우예요. 이 경우, 월세세액공제를 적용받아 월세의 1.5배 정도 되는 72만 원을 아낄 수 있습니다. 월세세액공제를 받기 위해서는 무주택 세대주인지, 월셋집의 면적이 얼마나 되는지 등 조건을 따져봐야 해요. 조건에 맞으면 증빙서류를 준비해서 회사에 제출해야 합니다. 증빙 서류는 주민등록등본, 임대차 계약서 사본, 월세액 이체증( - -은행 등 금융기관에서 발급)이 있습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (225, "회사가 돈이 부족해질 때, 기업을 운영하는 데 필요한 금액을 구입하기 위해 가장 일반적인 방법은 무엇입니까?", "대출", "유상증자", "투자", "유상증자", "회사를 운영하다 보면 돈이 부족해질 때가 있습니다. 당장 사업을 유지하기에도 부족한 상황일 수도 있고, 사업을 좀 더 확장하기 위해 투자할 돈이 부족한 상황일 수도 있겠죠. 자금 조달 방법은 크게 두 가지입니다. 첫 번째 방법은 대출을 받는 거예요. 우리가 필요할 때 개인대출을 받는 것처럼, 기업도 기업대출로 돈을 끌어올 수 있습니다. 은행과 같은 금융회사를 매개로 하므로 ‘간접 금융’이라 불러요. 두 번째 방법은 기업이 직접 증권(채권, 주식)을 발행하는 ‘직접 금융’입니다. ‘지금 돈 빌려주면 나중에 이자 쳐서 갚을게~’ 약속하면서 채권을 발행하거나, 주식을 더 발행해 파는 방법이 있습니다. 이 중에서 후자를 ‘증자’라고 부릅니다. 일반적으로 증자라고 하면 유상증자를 말합니다. 회사가 돈이 필요할 때, 주식을 더 발행해 불특정 다수에게 파는 거예요. 대략 이런 시나리오예요. 회사마다 유상증자를 해야 하는 이유, 유상증자로 신주를 얻는 주체, 유상증자의 결과가 다 다르기 때문에 주주에게 호재일지, 악재일지는 잘 따져봐야 합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (226, "기업이 일정한 기준에 따라 일정한 물량의 재고를 보유해야 하는 조건을 뜻하는 단어는?", "자율납품", "의무보유확약", "예상수요", "의무보유확약", "의무보유확약은 어떤 것을 ‘의무’적으로 ‘갖고 있도록’ ‘확’실하게 ‘약’속하는 것을 뜻합니다. 주식시장에서는 주식을 팔지 않고 보유하고 있겠다는 약속을 뜻해요. -\n기업이 상장하기 전, ‘수요예측’이라는 절차가 있어요. 은행이나 증권사, 보험사, 연기금 등 기관투자자를 통해 투자 수요를 예측하는 단계입니다. “우리 회사가 상장하면 한 주당 얼마에, 몇 주 살래?”하고 물어보는 과정이라 생각하면 돼요. -\n수요 예측이 끝나면 기업과 상장주관회사가 협의를 통해 공모주 가격을 결정합니다. 그리고 각 기관투자자에게 몇 주씩 줄지 ‘배정 물량’을 결정하게 돼요. -\n이때 각 기관투자자가 어떤 기업인지(투자성향, 공모주 참여실적 등), 공모주 가격을 얼마로 제시했는지, 의무보유기간은 얼마간으로 잡았는지 고려합니다.", "MUL", 1000000, 100000, -FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (227, "금융시장에서 아직 선진국은 아니지만 빠르게 경제 발전하고 해외 자본에 시장을 열기 시작한 국가들을 어떤 이름으로 부릅니까?", "강성국가", "이머징 마켓", "정책국가", "이머징 마켓", -"이머징마켓은 금융시장에서 자주 사용되는 용어예요. 아직 선진국은 아니지만 급격한 경제 발전과 함께 해외 자본에 시장을 열기 시작한 국가들을 ‘이머징마켓’이라고 부릅니다. 이머징마켓 투자는 고위험 고수익이라는 특징이 있어요. 우리나라는 아직 이머징마켓으로 분류되는데, 계속해서 선진국 시장에 편입되려고 노력하는 중이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (228, "일정 기간이 지나면 효력이 상실되는 제도를 뜻하는 단어는?", "소득공제", "일몰제", -"소비자보호법", "일몰제", "일몰제는 해가 어느 시점에 지는 것처럼, 일정 기간이 지나면 효력이 상실되는 제도를 뜻해요. 일몰제로 효력이 상실될 시기가 다가올 때, 정부는 해당 제도의 일몰 시한을 연장하기도 합니다. 신용카드 등 사용금액에 대한 소득공제의 경우, 10번 가까이 기한이 연장됐어요.", -"MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (229, "임상시험 절차를 통과한 후 시판 허가를 받은 신약을 개발에 성공했다는 것을 뜻하는 단어는?", "신약 개발", "임상시험", "의료기자", "임상시험", "‘신약 개발에 성공했다’라는 건 임상시험 절차를 통과해 시판 허가를 받았다는 것을 뜻합니다. 여기서 시판 허가를 받기 전 단계를 크게 ‘전 임상시험’, ‘임상시험단계’로 나뉩니다. 그중에서도 임상시험단계는 총 3상으로 나뉘어요. 각 단계를 통과하는 데 시간이 오래 걸리고, 성공 확률도 높지 않아 도중에 실패하는 경우가 대부분입니다. 국내 제약업계에서 개발에 성공한 신약은 지난 25년간 약 30개뿐이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (230, "제정된 법률을 미리 알리려는 의도에 따라 공표하는 것을 뜻하는 단어는?", "자유의 형언", "입법예고", "국제협정", "입법예고", "정책 관련 뉴스를 볼 때는 ‘정책이 어떤 단계에서 논의되고 있는지’ 확인해야 합니다. -\n‘발의됐다’라고 하면 국회에서 어떤 정책의 필요성에 대한 이야기가 나왔다는 뜻입니다. - -\n‘발의된 법안이 의결됐다’라고 하면 그 이야기대로 정책을 만들겠다는 뜻입니다. 실무 관련 구체적 내용은 정해지지 않은 단계예요. -\n법안이 의결되면 법제처로 넘어갑니다. 법제처는 정책을 어떻게 법으로 만들지 고민한 다음, 실생활에 적용하도록 법령을 만들어 ‘입법예고’를 해요. -\n즉, 발의-의결-입법예고가 모두 끝나야 하나의 법이 만들어집니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (231, "전후방산업에 속하는 산업의 특징은 무엇입니까?", "최소한의 노동 투입을 필요로 하는 산업", "후방산업과 연관효과가 크며 최종 소비자에 가까운 산업", "자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업", "후방산업과 연관효과가 크며 최종 소비자에 가까운 산업", "전후방산업 기업활동에서 부가가치가 생산되는 과정을 가치사슬이라고 해요. 땅 속에 묻혀 있던 철광석을 캐내서 철강으로 만들면 철광석으로 존재할 때보다 부가적인 가치가 더해지는 식입니다. 전방산업은 용도가 특정되며 최종 소비자에 가까운 산업이에요. 후방산업은 자본과 노동을 투입해 부가가치를 더해 나가는 가치사슬에서 원자재와 원료 쪽에 가까운 산업입니다. 자동차 산업이 제조업의 꽃이라고 불리는 이유는 최종 전방산업으로서 후방산업과 연관효과가 무척 크기 때문이에요. 수많은 고용과 부가가치를 창출하는 산업이에요.", "MUL", 1000000, 100000, FALSE); insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (232, "조각투자가 일반적으로 적용되는 대상은?", "선박과 대출채권", "부동산이나 저작권, 미술품 등 자산", "투자 플랫폼", "부동산이나 저작권, 미술품 등 자산", "실물을 쪼개 소액으로 투자하는 방식을 조각투자라고 해요. 가치 상승이 기대되는 자산의 소유권을 여러 명이 공동투자해 수익을 분배하는 투자 방식입니다. 투자 대상으로 부동산이나 저작권, 미술품은 물론 선박과 대출채권 등이 있습니다. 실물자산에 대한 일부 권리도 가질 수 있습니다. 실제 10억 원짜리 건물에 만 원을 투자한다면, 건물의 만 원어치 일부를 소유할 수 있습니다. 아주 소액이지만 건물주가 될 수 있는 셈이죠. 하지만 여전히 위험은 있습니다. 현물의 가치를 제대로 산정해야 하고, 중간에 사업자가 파산하거나 거래플랫폼이 도산하면 투자금을 날릴 수 있어요. 투자자 보호를 약관에 명시하는 등 믿을 만한 플랫폼을 골라야 하고, 내가 투자하려는 실물에 대한 지식이 어느 정도 요구됩니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (233, "기업의 경영 방침을 결정하는 중요한 회의는 무엇입니까?", "이사회", "주주총회", -"창업자 총회", "주주총회", "주주총회는 주식회사의 주주가 모여서 회사의 중요한 사안을 결정하는 의사결정회의를 뜻합니다. -\n설명이 어렵지만, 학급 회의와 크게 다르지 않습니다. 학급과 관련된 주요 안건을 두고 찬반 투표를 하고 의견을 나눴던 것처럼 주주총회에서도 회사와 관련된 주요 안건을 의논해 결정해요. \n주식회사라면 매년 최소 한 번 이상 주주총회를 개최합니다. 회사는 매년 1년 동안의 사업을 결산해 ‘결산 재무제표’를 만드는데요. 주주가 이 재무제표를 승인해줘야 확정할 수 있거든요. 이외에도 회사와 관련된 중요한 사안들을 싹 모아서 ‘정기 주주총회’를 여는 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (234, "주택을 국가에 담보로 맡기고 평생 일정한 금액을 받는 상품은?", "주택자금", " 주택연금", "주택가입", "주택연금", "주택연금은 현재 거주 중인 집을 국가에 담보로 맡기고 매달 연금으로 일정한 금액을 평생 받을 수 있는 상품입니다. 월 지급액은 가입자의 연령, 주택의 시장 가격, -이자율 등을 고려해서 산정해요. 다른 조건이 동일할 때, 주택의 시장 가격이 높을수록 월 지급액이 높아져요. 주택연금은 2019년 가입연령이 60세에서 55세로 하향됐어요. 가입 가능한 주택 가격 요건도 ‘시가 9억 원 이하’에서 ‘공시지가 9억 원 이하’로 완화됐습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (235, "생산 과정에 투입물로 사용하는 재화예요. 원자재와 다른 점은 한 번 가공을 거친 상태라는 점이에요. 이 말을 가장 잘 설명하는 단어는?", "원자재", "제품", "소비재", "중간재", -"생산자가 생산 과정에 투입물로 사용하는 재화예요. 원자재와 다른 점은 중간과정에 사용하기 위해 한 번 가공을 거친 상태라는 점이에요. 예를 들어, 철광석은 원자재지만 철광석을 녹여 만든 철판은 중간재라고 할 수 있어요. 중간재는 상품을 만들 때 최종소비자가 사는 완성된 결과물과도 다릅니다. 중간재인 철판은 최종소비자가 사용하기 어렵고, 자동차나 배를 생산하는 기업이 구매해 사용해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, - -option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (236, "자산의 가치가 줄어드는 것을 고려해야 하는 계정 처리 방식은?", "재고처리", " 감가상각", "인수합계", "감가상각", "누군가 사용하던 중고 물품을 정가와 동일한 가격에 구매하는 사람은 드물 거예요. 사려는 사람은 많은데 공급은 적어 프리미엄이 붙는 특수한 경우를 제외하면, 대부분의 상품은 개봉과 동시에 정가보다 낮은 가격에 거래됩니다. 심지어 포장을 뜯지 않았다고 해도 원래 가격보다는 낮은 가격에 거래되기 마련이죠. 누구나 새 걸 좋아하니까 생기는 일이에요중고 거래 가격은 소비자의 선호 체계를 고스란히 반영합니다. 구체적으로 세 가지 이유로 설명할 수 있습니다. \n효용 극대화: 새 상품 구매가 훨씬 더 기분 좋아요. ‘새 상품을 샀을 때보다 덜 좋은 기분’이 중고 거래가에 반영돼요. -\n정보의 비대칭성: 내가 알지 못하는 다른 사람의 손에 들어갔던 물건은 어떻게 다뤄지고 변화했는지 알 길이 없습니다. 이전 소유자가 기업이나 판매자보다 깔끔하게 상품을 관리할 가능성은 아주 적어요. ‘불확실성 감당 비용’이 중고 거래가에 반영됩니다. -\n손실 회피: 중고 제품은 환불이나 A/S 등 그 상품을 제조하고 판매한 기업의 서비스 제공 범위에서 벗어나 있을 가능성이 큽니다. 잠재적인 문제 발생 가능성도 중고 거래가격 책정에 반영됩니다. \n이런 경향을 한마디에 눌러 담은 것이 바로 감가상각이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (237, "이론적으로 경제가 인플레이션과 디플레이션이 없는 상태에서 금리를 정하려고 하는 것이 무엇일가?", "고정금리", "중립금리", "물가지수", "중립금리", "중립금리는 이론적으로 경제가 인플레이션(물가 상승)이나 디플레이션(경기 침체) 압력이 없는 잠재성장률 수준을 유지하게 만드는 이론적인 금리 수준이에요. 금리가 너무 높지도, 낮지도 않은 것을 뜻하죠. 중립금리는 절대적으로 정해진 수치가 아니라 그때그때 경제 상황에 따라 달라져요. 경제가 완전고용 상태이고 물가수준이 안정적인 상태에서 돈의 수요와 공급이 균형을 이뤄야 하니까요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (238, "우리나라에서 일반적으로 사용하는 화폐와는 다른 결제수단은?", "한국은행권", " 지역화폐", "현금", "지역화폐", "지역화폐는 백화점 상품권과 같은 일종의 ‘유가증권’입니다. -현금처럼 사용할 수 있는 결제수단 중 하나지만, 일반적으로 사용하는 화폐와는 달라요. 우리가 흔히 쓰는 1천 원, 1만 원 권과 같은 화폐는 한국은행이 발행하는 한국은행권입니다. 국가에서 법으로 공식 인정한 화폐인 한국은행권과는 다르게, 지역화폐는 지자체에서 마련한 조례에 따라 발행, 유통되기 때문에 조례에서 허용하는 범위 내에서만 사용할 수 있어요. 주로 지역상권 활성화, 지역 공동체 -강화를 위한 목적으로 활용되고 특정 지역 내에서 제한된 구성원끼리 사용할 수 있습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (239, "기업이 직원을 고용할 때 지불해야 하는 최소한의 임금을 뜻하는 단어는?", " 최고임금", "최저임금", "평균임금", "최저임금", "최저임금은 최저임금위원회의 논의 및 의결을 통해 결정됩니다. 매년 4월경에 논의를 시작해 6월 말~7월 초·중순에 합의된 안을 발표하곤 해요. \n구체적으로는 ‘고용노동부 장관이 최저임금위원회에 최저임금을 심의 및 의결하는 것을 요청한 시점’ 을 기준으로 90일 이내에 결정해야 돼요. -\n고용노동부 장관은 매년 3월 31일에 심의를 요청하고 있습니다. 그래서 원칙적으로는 6월 말까지 의결이 완료되어야 하지만, 경영계와 노동계의 입장이 좁혀지지 않으면 7월까지 넘어가기도 해요. \n최저임금위원회가 내년도 최저임금에 대해 결론을 내리고 나면, 고용노동부 장관이 8월 5일까지 결정된 내용을 발표합니다. 이때 고시된 최저임금의 효력이 다음 해 1월 1일부터 발생해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (240, "추가예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하는 단어는?", -"예산", "추기", "경정", "추경", "추경은 ‘추가경정예산’의 줄임말이고, 경정(更正)은 ‘바르게 고친다’라는 뜻이에요. 추가경정예산은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하죠. 연초에 세운 계획보다 돈을 더 쓰겠다는 건데요. 추경안은 자연재해나 큰 사고가 나서 인프라와 사회를 복구해야 할 때 나옵니다. 그래서 지난 추경안 규모를 보면 굵직한 경제적 충격들을 읽을 수 있어요. 추경 규모가 10조 원을 넘는 곳(빨간색 그래프) 은 리먼브라더스 사태가 촉발한 세계 금융위기, 브렉시트 등 우리나라뿐만 아니라 세계적인 경제 위기가 있었던 시기입니다. 그중에서도 2020년과 2021년의 추경 횟수와 금액은 ‘역대급’이니, 코로나19가 세계적으로 얼마나 커다란 경제적 충격을 가져왔는지 알 수 있어요. 사실 추경 자체가 엄청나게 특별한 일은 아닙니다. 우리나라뿐만 아니라 전 세계 국가 대부분이 매년 추경을 실시합니다. 돈 쓸 일이 너무 - -많다 보니 1년 동안 얼마가 필요할지 정확하게 예측하기가 어렵거든요. 돌발사태가 발생하기도 하고요. 국가가 사업을 집행하는 데는 국민의 세금이 사용됩니다. 그래서 국민의 대리인인 국회의원과 정당이 추가예산이 필요하다는 행정부를 상대로 견제하기 시작합니다. ‘추경을 하느냐, 마느냐’보다는 추경 횟수와 액수 등을 두고 다투죠. 일명 ‘감액심사’라고 해요. 정치적 이해관계에 따라 여당이 행정부 편을 많이 들어주기도 하는데요. 보통 매년 추경을 하기 때문에 ‘필요하다’라는 쪽으로 결론이 나긴 합니다. 하지만 모든 추경안이 실행되는 건 아니에요. 예를 들어 어떤 정당이 추경을 해야할 만큼 꼭 필요한 사업이라고 생각하지 않고, 이들의 주장이 국회 다수결로 지지를 받는다면 추경안은 실행되지 않습니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (241, "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장을 멈추는 구간을 무엇이라고 하나요?", "성장폭", "캐즘", "마이그레이션", " 캐즘", "혁신적인 상품이 초기에 열광적인 시장 수요를 불러일으켰다가, 보편적인 일상으로 자리잡기 직전에 성장이 잠시 멈추는 구간을 ‘캐즘(Chasm)’이라고 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (242, "코스피 지수가 나타내는 것은?", "금리", "주가지수", "환율", "주가지수", " 금융시장에서 ‘인덱스’는 ‘지수’를 뜻합니다. 여기서 ‘지수’는 IQ지수, BMI지수, 행복지수, 빅맥지수에 등장하는 것과 같은 개념이에요. ‘주가지수’는 주식의 가격을 ‘지수화’한 걸 의미하죠. \n우리나라 대표 주식시장인 유가증권시장에서는 유가증권시장은 ‘(현재 시점에서, 주식시장에 상장된 기업의 시가총액을 모두 합친 것) ÷ (과거의 특정 시점에서, 상장된 모든 기업의 시가총액을 모두 합친 것) x 100’으로 지수를 산출합니다. -\n‘과거의 특정 시점’은 고정돼있습니다. 유가증권시장은 1980년 1월 4일이 기준이에요. 이렇게 1980년 1월 4일과 현재를 비교하는 지수화 작업을 통해 산출한 숫자를 한국종합주가지수(KOrea Composite Stock Price Index)라고 부릅니다. 약자인 KOSPI, 코스피가 더 익숙할 거예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (243, "코스피200를 구성하는 주식의 수는?", "코스다이", "코스피200", "코스트500", "코스피200", "코스피200은 유가증권시장에 상장된 기업 중, 시가총액 등을 기준으로 상위 200개 기업의 주식을 지수화한 것을 뜻합니다. -\n유가증권시장에 상장된 모든 기업의 주식을 지수화한 KOrea Composite Stock Price Index( 한국종합주가지수), 즉 KOSPI와는 다른 지수예요. 일종의 우등생 클럽이라고 보면 됩니다. -\n한 국가의 대표 지수에 새롭게 편입되는 일은 기업에 큰 호재입니다. 국내외 투자자들이 많이 참고하는 지표인데다, 지수의 움직임을 따르는 펀드의 규모도 상당하거든요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (244, "한 시간 안에 다양한 제품을 배송하는 서비스를 뜻하는 단어는?", "온라인 커머스", -"퀵커머스", "당일배송", "퀵커머스", "퀵커머스는 ‘퀵’(Quick)과 상거래 ‘커머스’(Commerce)의 합성어입니다. 음식 배달을 넘어 화장품이나 책, 약 등 다양한 제품을 1시간 안에 배송하는 서비스를 뜻해요. 온라인 커머스 시장의 당일배송이나 새벽배송보다 한 단계 진화된 형태예요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (245, "통화 가치가 높으면 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있는 경우는?", "인플레이션", "킹달러", "환율", "킹달러", "달러 가치 초강세 현상을 뜻합니다. 2022년 미국 달러 가치는 20년만에 최고 수준으로 올랐는데, 미국 연방준비제도( 연준)가 인플레이션을 잡기 위해 금리를 급격하게 올렸기 때문이에요. 통화 가치가 높다면 기준시점이나 상대국 통화에 비해 더 적은 돈을 주고서 더 많은 물건을 구매할 수 있어요. 반대로, 다른 나라의 통화 가치가 높아지면 환전할 때 우리나라 입장에서는 그 나라의 통화가 비싸지게 됩니다. 값비싼 통화를 사야 하니까요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (246, "어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상을 뜻하는 단어는?", "경기활성화", "타임래그", "물가인플레이션", "타임래그", "타임래그(time-lag) 는 우리나라 말로는 ‘시간차’입니다. 어떤 자극이 가해지면 물건이나 활동에 변화가 일어나기까지 시간이 걸리는 현상을 뜻해요. 경제학에서도 타임래그 현상을 종종 볼 수 있어요. 예를 들어, - -기준금리를 낮추기로 결정한 뒤, 시장에 유동성이 풍부해지며 경기가 활성화되고 물가가 오르는 것도 시간차를 두고 발생하는 식이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (247, "자동차 제조 회사의 경쟁 요인을 설명하는 단어는?", "생산비용", "테슬라요건", " 가격경쟁", "테슬라요건", "테슬라 요건의 정식 명칭은 ‘이익 미실현 기업 특례 상장’이에요. \n테슬라 요건은 상장 요건에 미달하더라도 성장성이 높은 기업이 상장할 수 있도록 만든 특례 제도입니다. -\n미국 기업 ‘테슬라’가 적자였음에도 나스닥에 상장한 후 크게 발전한 사례에서 따와 ‘테슬라 요건’ 이라는 이름이 붙었습니다. -\n우리나라는 2017년부터 테슬라 요건을 적용하고 있어요. -\n국내에서 테슬라 요건으로 최초 상장한 기업은 온라인 상거래 플랫폼 사업을 영위하는 카페24예요.", -"MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (248, "티커의 의미는?", "주식가격", "티커", "시장분석", "티커", "국내 주식을 할 때는 특정 주식을 검색할 때 ‘종목명’이나 ‘종목코드’ 6자리를 입력해요. -\n미국 주식시장은 조금 다릅니다. 종목코드가 대문자 알파벳으로 돼 있거든요. 정식 명칭은 ‘티커 (ticker)’입니다. -\n티커로 주식이 어느 주식시장에 상장했는지도 구분할 수 있습니다. 뉴욕증권거래소에 상장된 종목은 주로 3자리 이내, 나스닥에 상장된 종목은 5자리 이내의 알파벳으로 티커를 정합니다. 테슬라는 -TSLA, 애플은 AAPL이 티커예요. 둘 다 나스닥에 상장된 기업이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (249, "반도체를 설계도 없이 위탁 생산하는 기업은?", "팹리스", "파운드리", "FAB (Fabrication)", "파운드리", "반도체 기업은 크게 세 종류로 나뉩니다. 이중, 파운드리는 팹리스의 설계도를 받아다 주문 들어온 만큼만 반도체를 가공, 위탁 생산하는 기업이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (250, "원유 대금을 결제할 때 미국 달러를-worldwide currency로 만든 시스템은?", " 국제통화체제", "페트로 달러 체제", "글로벌화 경제체제", "페트로 달러 체제", "페트로 달러 체제는 1975년부터 원유 대금을 미국 달러로만 결제하도록 한 시스템으로 미국 달러를 세계 기축통화로 만든 원동력이에요. 페트로 달러 체제는 미국이 사우디 왕실에 전한 은밀한 제안에서 시작했어요. 1975년, 미국은 사우디에 ‘중동 맹주국 지위를 보장할 테니 원유 결제엔 달러화만 쓰라’고 제안했고, 사우디가 받아들였습니다. 이후로 미국은 사우디아라비아의 든든한 우방국으로 자리 잡았어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (251, "근로계약을 할 때 연장·야간·휴일근무를 고려한 연봉 산정 방식은?", "선택적 임금제", "포괄임금제", "기본급제", "포괄임금제", "포괄임금제는 근로계약을 할 때 연장·야간· 휴일근무를 하는 것으로 가정하고 연봉에 관련 수당을 포함하는 임금 산정 방식입니다. 근로시간을 엄격하게 통제하기 힘든 시스템이나 선택적 근무제 등 비교적 자유로운 근무 문화를 가진 회사의 경우 포괄임금제로 연봉을 산정하는 경우가 많아요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (252, "특정 사업을 프로젝트로 진행할 때 사업 자체를 담보로 잡아 돈을 빌리는 방식을 무엇이라 하는가?", "투자 금지", "프로젝트 파이낸싱 (PF)", "경영 위험 방지", "프로젝트 파이낸싱 (PF)", "PF는 프로젝트 파이낸싱의 약자예요. 건설 등 특정 사업을 프로젝트로 진행할 때 이 사업만 담당하는 특수목적법인(SPC)을 세우고, 해당 사업 자체를 담보로 잡아 돈을 빌립니다. 만약 공장 건설 프로젝트를 PF로 진행한다고 하면 이 공장이 앞으로 물건을 생산·판매해 들어올 수익까지도 계산해서 대출을 받을 수 있습니다. 리스크가 상당히 큰 대출 방식이에요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (253, "실업률과 인플레이션 사이에 반비례 관계가 있는 경제학 모형은?", "라자루스 곡선", "필립스곡선", "케인즈 곡선", "필립스곡선", "필립스곡선은 실업률과 인플레이션(물가 상승) 사이 반비례 관계가 있다는 경제학 모형이에요. 여기서 인플레이션은 임금상승률(명목)로 나타냅니다.", - -"MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (254, "여행 패키지 상품 구성을 위해 미리 사둔 항공권을 이용한 전략은?", "비용절감", -"하드 블록", "예산관리 방안", "하드 블록", "여행사가 여행 패키지 상품 구성을 위해 미리 사둔 항공권이에요. 하드 블록 전략을 이용하면 비수기에는 시세보다 다소 비싸게 대량구매를 해두고, 성수기에는 시세보다 저렴하게 대량구매를 해두어 안정적인 여행객 수요 대응을 할 수 있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (255, "한미 금리역전이 발생할 때, 미국의 기준금리가 한국보다 ____________________.", -"낮아진다", "높아진다", "그치않는다", "높아진다", " 한미 금리역전은 미국의 기준금리가 한국보다 높아진 것을 뜻해요. 보통 국가의 신용도가 높을수록 기준금리가 상대적으로 낮아요. 예를 들어 경제규모 세계 1위이자 기축통화국인 미국은 다른 개발도상국보다 낮은 금리를 유지하죠. 우리나라도 보통 미국보다 기준금리가 높고요. 기준금리가 낮다는 건, 해당 국가의 돈값(이자)을 매기는 기준이 다른 국가보다 낮다고 해석할 수 있는데요. 투자자 입장에서는 같은 돈을 미국 달러에 투자했을 때 -받는 돈값이 적더라도, 달러를 매력적으로 느낍니다. 신용도가 높고 경제력이 탄탄해 안전하니까요. 미국보다 상대적으로 금리가 높은 우리나라와 같은 국가도 다른 의미로 매력적인 투자처예요. 상대적으로 높은 금리, 즉 높은 수익률을 제공하기 때문이에요. 그런데 미국이 인플레이션을 해소하기 위해 기준금리를 올리면서, 우리나라보다 돈값을 높게 쳐주기 시작했어요. 안전한데다 금리까지 높다면? 우리나라 금융시장에 투자하던 외국인 투자자들이 돈을 빼서 미국으로 향할 수도 있어요. 물론 그렇지 않았던 사례도 있었지만, 한국과 미국의 금리가 역전되면 대책이 필요하다는 얘기가 나오곤 해요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (256, "한국 게임의 서비스를 중국에 저해하는 조치를 내린 것은?", "사드 배치", "한한령", "중국 관광객 통제", "한한령", "지난 2016년, 우리나라의 사드 배치 발표로 중국 정부는 ‘한한령( 중국 내 한류 금지령)’을 내립니다. 중국인 관광객들의 우리나라 방문을 통제하거나 우리나라 상품 수입을 규제하는 등 다양한 방식으로 압박해왔어요. 콘텐츠 전반에 한한령이 적용되면서 국내 게임업체도 시련을 겪었어요. 중국에 게임을 서비스하고 수익활동을 하기 위해서는 ‘외자판호’가 반드시 필요한데, 중국이 한국 게임에 대해 외자판호 발급을 하지 않기로 했거든요. 그전까지만 해도 국내 게임업체의 매출 중 큰 부분이 중화권 매출이었습니다. 그런데 진출 자체가 막혀버렸으니 엄청난 악재가 될 수밖에 없었어요. 이후 국내 콘텐츠 전반에 적용되던 한한령이 하나둘 풀리기 시작했지만 유독 게임 분야는 규제가 풀리는 속도가 느렸어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (257, "심야 택시를 탈 때 기존 요금에 얼마를 더한 금액을 적용하는 것은?", "할인", " 할증", "추가요금", "할증", "나눌 ‘할(割)’, 더할 ‘증(增)’을 합친 한자어예요. 일정 기준에 -얼마를 더한다는 뜻으로, 영어로는 ‘extra charge’로 번역할 수 있어요. 보통 아래와 같은 상황에서 사용됩니다. 심야 할증: 심야에 택시 또는 고속버스를 이용할 때, 기존 요금에 얼마를 더한 금액을 적용하는 것", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (258, "사회의 이익을 추구하는 투자전략은?", "헤지펀드", "행동주의펀드", "투자전략", -"행동주의펀드", "행동주의펀드는 헤지펀드 중에서도 기업 의결권을 확보할 수 있을 만큼 투자해 기업의 경영에 적극적으로 참여하는 투자전략을 갖고 있는 펀드를 뜻합니다. 행동주의펀드 역시 최대 이익을 추구합니다. 기업의 자산을 매각해 현금흐름을 개선하고 주주배당을 확대하며, 구조조정을 통해 핵심 자산 가치를 불리는 방식을 요구하기도 해요. 행동주의펀드는 기업의 군살을 없애고 주주의 권리를 올리며 기업 수익을 극대화한다는 장점을 갖고 있지만, 기업의 단기적 수익에 집착하다가 본질을 해치고 ‘먹튀’한다는 비판을 동시에 받곤 합니다.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (259, "가족이 함께 생활하는 집을 뜻하는 단어는?", "자산적 주택", "행복주택", "도시 주택", "행복주택", "행복주택은 대학생, 사회초년생, 신혼부부, 고령자 등을 위해 LH가 새로 건설해 공급하는 공공임대주택을 말합니다. -\n특징: 행복주택은 직장과 학교와 가까운 곳(직주근접)이거나 대중교통 이용이 편리한 곳에 위치하고, 주변에 다양한 주민 편의시설을 함께 짓는다고 해요. -\n임대료: 행복주택에도 여러 가지 유형이 있는데요, 유형별 입주자격과 소득·자산기준을 충족할 경우 주변시세 대비 60~80% 저렴한 임대조건으로 입주할 수 있어요. - -\n기간: 행복주택의 총 임대기간은 대학생·청년 6년, 유자녀 신혼부부 10년, 고령자·수급자 20 년으로 설정돼있어요.", "MUL", 1000000, 100000, FALSE); -insert into finut.quiz(id, question, option1, option2,option3,answer,description,quiz_type,correct_money,wrong_money,displayed) values (260, "한 회사의 물건을 다른 회사에 저가에 판매하는 경우 손실을 뜻하는 단어는?", " 자본손실", "환차손", "수익손실", "환차손", "‘환차손’은 환율 변동에 따른 손해를 뜻합니다. 반대말은 ‘환차익’이에요. -\n1,200원을 1달러로 바꾼 그 시점에는 환차손이나 환차익이 발생하지 않아요. -\n1,200원 주고 산 1달러를 다시 우리나라 돈으로 바꿔야 할 때 환율이 변동해 1,000원을 받게 되면 200원의 환차손이 발생하는 거죠. -\n200원은 투자원금 1,000원 기준 20%나 된답니다. 다시 말해, 1달러에 1,200원에서 1,000원이 됐을 때 기준 미국 증시에서 번 돈을 환전해서 실질적인 수익이 나는 시점은 수익률 21%부터인 거예요.", "MUL", 1000000, 100000, FALSE); diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 2f5c0bb..65b3f81 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -160,6 +160,7 @@ public Users getUserIdByToken(HttpServletRequest request, HttpServletResponse re Users user; Optional quiz; + System.out.println(header); if (header != null && header.startsWith("Bearer ")) { String accessToken = header.substring(7); // "Bearer " 제거 diff --git a/src/main/resources/difficulty.sql b/src/main/resources/difficulty.sql new file mode 100644 index 0000000..ecc6888 --- /dev/null +++ b/src/main/resources/difficulty.sql @@ -0,0 +1,3 @@ +INSERT INTO Difficulty (difficulty, diff_quiz_cnt) VALUES ('MI', 3); +INSERT INTO Difficulty (difficulty, diff_quiz_cnt) VALUES ('HI', 3); +INSERT INTO Difficulty (difficulty, diff_quiz_cnt) VALUES ('LO', 3); diff --git a/src/main/resources/level.sql b/src/main/resources/level.sql new file mode 100644 index 0000000..493798e --- /dev/null +++ b/src/main/resources/level.sql @@ -0,0 +1,13 @@ +/* +-- Query: SELECT * FROM finut.level +LIMIT 0, 5000 + +-- Date: 2024-11-06 01:59 +*/ +INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (1, 'PARTTIMEJOB', 400000, 5); +INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (2, 'INTERN', 1000000, 5); +INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (3, 'STAFF', 2000000, 5); +INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (4, 'ASSOCIATEMANAGER', 4000000, 5); +INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (5, 'MANAGER', 6000000, 5); +INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (6, 'SENIORMANAGER', 8000000, 5); +INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (7, 'DIRECTOR', 10000000, 5); diff --git a/src/main/resources/quiz.sql b/src/main/resources/quiz.sql new file mode 100644 index 0000000..1772e4e --- /dev/null +++ b/src/main/resources/quiz.sql @@ -0,0 +1,44 @@ +insert into finut.quiz(difficulty, question, answer,description) values ("MI", "1금융권은 정부에서 만들어진 ‘상호신용금고법’으로부터 나타난 금융회사가 아니라는 것이다.", "TRUE", "은행 외에는 고금리의 사금융밖에 선택지가 없던 1970 년대, 정부에서 ‘상호신용금고법’을 만들어 사금융을 양성화하기 시작했습니다. 이때부터 나타난 회사들은 특정 그룹이나 분야에 전문성을 가진 회사였습니다. 이렇게 새로운 금융회사들이 만들어지던 시기에, 은행과 은행이 아닌 금융회사를 구별해서 부르기 시작했습니다. 예전부터 있었던 은행을 1 금융권으로, ‘은행이 아닌’ 금융회사를 2금융권으로 부르게 된 거죠. 1금융권인 은행과 2금융권에 속해있는 저축은행의 경우, 예금과 대출을 해준다는 측면에서 비슷한 기능을 하기 때문에 소비자 입장에서는 같은 선상에 두고 비교해볼 만합니다.안정성이 높지만 수익률(이자율)이 낮은 1금융권 예금을 택할지, 대출금리가 높지만 대출받기가 더 쉬운 2금융권 대출을 택할지 비교해보는 거예요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "추가경정예산안은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하는 것이다.", "TRUE", "추경은 ‘추가경정예산’의 줄임말이고, 경정(更正)은 ‘바르게 고친다’라는 뜻이에요. 추가경정예산은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하죠. 연초에 세운 계획보다 돈을 더 쓰겠다는 건데요. 추경안은 자연재해나 큰 사고가 나서 인프라와 사회를 복구해야 할 때 나옵니다. 그래서 지난 추경안 규모를 보면 굵직한 경제적 충격들을 읽을 수 있어요. 추경 규모가 10조 원을 넘는 곳(빨간색 그래프)은 리먼브라더스 사태가 촉발한 세계 금융위기, 브렉시트 등 우리나라뿐만 아니라 세계적인 경제 위기가 있었던 시기입니다. 그중에서도 2020년과 2021년의 추경 횟수와 금액은 ‘역대급’이니, 코로나19가 세계적으로 얼마나 커다란 경제적 충격을 가져왔는지 알 수 있어요. 사실 추경 자체가 엄청나게 특별한 일은 아닙니다. 우리나라뿐만 아니라 전 세계 국가 대부분이 매년 추경을 실시합니다. 돈 쓸 일이 너무 많다 보니 1년 동안 얼마가 필요할지 정확하게 예측하기가 어렵거든요. 돌발사태가 발생하기도 하고요. 국가가 사업을 집행하는 데는 국민의 세금이 사용됩니다. 그래서 국민의 대리인인 국회의원과 정당이 추가예산이 필요하다는 행정부를 상대로 견제하기 시작합니다. ‘추경을 하느냐, 마느냐’보다는 추경 횟수와 액수 등을 두고 다투죠. 일명 ‘감액심사’라고 해요. 정치적 이해관계에 따라 여당이 행정부 편을 많이 들어주기도 하는데요. 보통 매년 추경을 하기 때문에 ‘필요하다’라는 쪽으로 결론이 나긴 합니다. 하지만 모든 추경안이 실행되는 건 아니에요. 예를 들어 어떤 정당이 추경을 해야 할 만큼 꼭 필요한 사업이라고 생각하지 않고, 이들의 주장이 국회 다수결로 지지를 받는다면 추경안은 실행되지 않습니다."); +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "2차전지는 충전과 방전을 통해 사용이 가능한 전지가 아니에요.", "FALSE", "2차전지는 충전과 방전을 통해 여러 번 사용이 가능한 전지예요. 대표적인 2 차전지로는 휴대폰 배터리가 있습니다. 종류는 납 축전지, 니켈카드뮴 전지, 니켈수소 전지, 리튬이온 전지 등이 있어요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("MI", "52주 신고가는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가입니다.", "TRUE", "52주 신고가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 높은 주가를 말해요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말합니다.", "TRUE", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말해요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "bp(베이시스포인트)는 0.01%p의 움직임도 금융시장에 큰 영향을 미칩니다.", "TRUE", "기준금리 뉴스에 자주 등장하는 ‘bp’는 ‘basis point’의 약자예요. 금융에서 쓰이는 기본단위로, 금리나 수익률, 환율을 나타낼 때 사용합니다. 일반적으로 사용하는 백분율이 아닌 ‘만분율’ 단위의 움직임을 표현하는데요. 1bp는 0.01%p, 10bp는 0.1%p, 100bp는 1%p예요. 금융시장에서는 0.01%p의 움직임도 영향력이 커요. 그래서 0.01%p도 뉴스에 자주 언급됩니다. 백분율을 기준으로 ‘퍼센트포인트’라고 말하는 것보다 만분율을 기준으로 bp로 나타내는 것이 정보전달에 더 효율적이라서 사용한다는 얘기가 있어요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("MI", "DSR은 내 소득 대비 금융부채 원리금 상환비율로, 40%를 넘는 경우에는 대출을 해주지 않는다.", "TRUE", "DSR(Debt Service Ratio)은 내 소득 대비 금융부채 원리금 상환비율이에요. DSR 40%라면 내 연 소득이 1억 원일 때, 1년 동안의 원금과 이자 상환비율이 4천만 원을 넘지 않는 정도까지 대출을 해준다는 뜻이에요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "DTI(총부채상환비율)는 연 소득 대비 금융비용 부담률을 나타내는 지표입니다.", "TRUE", "DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. DTI는 ‘나의 연소 득’에서 ‘주택담보대출의 원금 상환과 이자, 다른 대출의 이자로 나가는 금액’이 차지하는 비중으로 구합니다. 내가 가진 모든 대출의 원리금 상환금액을 합쳐 따지는 DSR보다는 유한 기준입니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "ESG는 환경, 사회, CORPORATE GOVERNANCE에 대한 고려를 의미합니다.", "TRUE", "ESG는 Environmental(환경), Social(사회), Governance(지배구조)의 첫 글자를 조합한 단어로 기업의 친환경 경영, 사회적 책임, 투명한 지배구조 등을 의미합니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("MI", "ETF는 특정 주식에 대한 투자 상품이 아니다.", "TRUE", "ETF(Exchange Traded Fund)는 말 그대로 인덱스펀드를 거래소에 상장시켜 투자자들이 주식처럼 편리하게 거래할 수 있도록 만든 상품입니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "G7은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최하는 7개국을 의미합니다.", "TRUE", "G7. Group of Seven Summit. 주요 7개국 정상회담의 약자입니다. 미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본 7개국은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최해요. 이 회담뿐만 아니라 이 회담에 참여하는 7개국을 G7이라고 줄여 부르기도 해요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 것이다.", "TRUE", "GNI는 Gross National Income의 약자로, ‘국민총소득’입니다. GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 거예요. 우리나라에 거주하고 있는 외국인의 소득은 제외하고, 외국에 거주하는 우리나라 국민의 소득을 포함해요. GNI를 구하는 가장 큰 이유는 국가가 아니라 국민들의 생활 수준을 알아보기 위해서예요. GNI와 유사한 지표로는 GDP가 있어요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("MI", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 방식으로 진행되는 것이다.", "TRUE", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 비율을 말해요. 이 수치가 높은 나라일수록 전 세계 자원이 거쳐가는 글로벌 생산기지라 할 수 있어요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "LTV는 주택담보대출의 대출가능금액을 산출할 때 사용되는 공식입니다.", "TRUE", "LTV는 주택담보대출비율(Loan to Value ratio)입니다. 공식은 ‘(대출한 금액) / (아파트 가치)*100’이에요. 즉, 총 아파트 가치에 비교한 대출금의 비중을 보여줘요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "M&A(인수합병)는 기업이 다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념입니다.", "TRUE", "M&A는 ‘Merger(합병)&Accquisition(인수)’의 약자로, 인수와 합병을 통해 회사 규모를 키우거나 시장에서 빠르게 경쟁력을 키우는 것이 목적이에요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "PMI ‘ISM 제조업 구매관리자지수’는 생산 관련 지수가 아니고, 경제동향지표입니다.", "TRUE", "PMI 지수는 미국의 공급관리협회에서 매달 조사하는 경기동향지표로, 제조업 실무자에게 업황을 묻는 방식으로 업계 전망을 직접적으로 파악할 수 있어요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("MI", "가처분소득은 내가 번 소득에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다.", "TRUE", "가처분소득은 내가 번 소득 중 소비와 저축으로 쓸 수 있는 돈을 뜻해요. 구체적으로는 내가 번 돈에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다.", "TRUE", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "개인소비지출(PCE)은 개인이 소유한 재산을 사용하여 구입하는 모든 물품과 서비스를 의미합니다.", "TRUE", "개인소비지출(Personal Consumption Expenditures, PCE)은 가계가 재화와 서비스를 구매하는 데 사용하는 지출을 의미합니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("MI", "거래대금은 주식이 사고 팔린 총 금액으로, 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다.", "TRUE", "거래대금은 주식이 사고 팔린 총 금액입니다. 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("HI", "경기순환사이클은 상승과 하락을 반복하는 현상을 의미하며, 크게 회복기-활황기- 후퇴기-침체기가 있다.", "TRUE", "경기가 일정 주기를 두고 상승과 하락을 반복하는 현상을 경기순환이라고 합니다."); + +insert into finut.quiz(difficulty, question, answer, description) values ("MI", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동·자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부입니다.", "TRUE", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동· 자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부라고 할 수 있어요."); + +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "경착륙은 호황이 끝나고 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다.", "TRUE", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 연착륙과 대비되는 개념입니다."); \ No newline at end of file diff --git a/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java b/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java index 344e8fa..6752d7c 100644 --- a/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java +++ b/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java @@ -1,2 +1,78 @@ -package com.finut.finut_server.controller;public class QuizControllerTest { +package com.finut.finut_server.controller; + +import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.user.Users; +import com.finut.finut_server.service.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultMatcher; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import java.util.Optional; + +import static org.springframework.test.web.client.match.MockRestRequestMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(QuizController.class) +public class QuizControllerTest { + @Autowired + private WebApplicationContext context; + + @Autowired + + private MockMvc mockMvc; + + @MockBean + private QuizService quizService; + + @MockBean + private QuizDoneService quizDoneService; + + @MockBean + private UsersService usersService; + + @MockBean + private GoogleAuthService googleAuthService; + + @BeforeEach + public void setUp() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); + } + + @Test + public void testQuizCorrectSuccess() throws Exception { + // Mock data + Long quizId = 1L; + Users mockUser = new Users(); // Replace with actual Users object setup + Quiz mockQuiz = mock(Quiz.class); // Replace with actual Quiz object setup + + // Mock behavior + when(usersService.getUserIdByToken(any(HttpServletRequest.class), any(HttpServletResponse.class))) + .thenReturn(mockUser); + when(quizService.getQuizByQuizId(quizId)).thenReturn(Optional.of(mockQuiz)); + + // Perform test + mockMvc.perform(get("/correct/{quizId}", quizId) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect((ResultMatcher) jsonPath("$.message").value("success")); + + // Verify that services were called as expected + + verify(quizDoneService, times(1)).saveQuizDone(mockUser, mockQuiz, true); + verify(usersService, times(1)).updateDiffLevelCnt(mockUser.getId()); + } + } From 2eaf02d13dc9257d2f1141e41abeedefe1d2f0da Mon Sep 17 00:00:00 2001 From: yeojin Date: Fri, 8 Nov 2024 13:07:17 +0900 Subject: [PATCH 43/52] =?UTF-8?q?Update=20Quiz:=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=ED=80=B4=EC=A6=88=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A7=84?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/domain/quizDone/QuizDone.java | 12 ++++++++++++ .../domain/quizDone/QuizDoneId.java | 7 +++++++ .../finut_server/service/QuizDoneService.java | 17 +++++++++++++---- .../finut/finut_server/service/QuizService.java | 2 ++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java index d8dcff6..28e1ccd 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -27,5 +27,17 @@ public class QuizDone { private Boolean isCorrect = false; + // 추가 생성자 - 필요한 경우 사용 + public QuizDone(Users user, Quiz quiz, boolean isCorrect) { + this.id.setQuizId(quiz.getId()); + this.id.setUserId(user.getId()); + this.quiz = quiz; + this.user = user; + this.isCorrect = isCorrect; + } + + public QuizDone() { + + } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java index 03d17b7..c9d331c 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java @@ -1,13 +1,20 @@ package com.finut.finut_server.domain.quizDone; +import jakarta.persistence.Column; import jakarta.persistence.Embeddable; +import lombok.Setter; import java.io.Serializable; import java.util.Objects; +@Setter @Embeddable public class QuizDoneId implements Serializable { + + @Column(name = "quiz_id") private Long quizId; + + @Column(name = "user_id") private Long userId; // equals 메서드 diff --git a/src/main/java/com/finut/finut_server/service/QuizDoneService.java b/src/main/java/com/finut/finut_server/service/QuizDoneService.java index 8750d54..2e75704 100644 --- a/src/main/java/com/finut/finut_server/service/QuizDoneService.java +++ b/src/main/java/com/finut/finut_server/service/QuizDoneService.java @@ -2,6 +2,7 @@ import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.quizDone.QuizDone; +import com.finut.finut_server.domain.quizDone.QuizDoneId; import com.finut.finut_server.domain.quizDone.QuizDoneRepository; import com.finut.finut_server.domain.user.Users; import org.springframework.beans.factory.annotation.Autowired; @@ -15,12 +16,20 @@ public class QuizDoneService { @Autowired QuizDoneRepository quizDoneRepository; - QuizDone quizDone; + public void saveQuizDone(Users user, Quiz quiz, boolean isCorrect) { - quizDone.setQuiz(quiz); - quizDone.setUser(user); - quizDone.setIsCorrect(isCorrect); + QuizDone quizDone = new QuizDone(user, quiz, isCorrect); +// QuizDoneId quizDoneId = new QuizDoneId(); +// +// quizDoneId.setQuizId(quiz.getId()); +// quizDoneId.setUserId(user.getId()); +// +// quizDone.setId(quizDoneId); +// +// quizDone.setQuiz(quiz); +// quizDone.setUser(user); +// quizDone.setIsCorrect(isCorrect); quizDoneRepository.save(quizDone); } diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index 003c627..e079dae 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -36,6 +36,7 @@ public class QuizService { public Optional getQuiz(Long userId) { Optional userOpt = usersRepository.findById(userId); if (userOpt.isEmpty()) { + System.out.println("userOpt is empty"); return Optional.empty(); } Users user = userOpt.get(); @@ -57,6 +58,7 @@ public Optional getQuiz(Long userId) { // 남은 퀴즈가 없으면 Optional.empty() 반환 if (uncompletedQuizzes.isEmpty()) { + System.out.println("uncomplete Quizzes is empty"); return Optional.empty(); } From c088335c12964f5d36c72804fb6c58f328d1d86e Mon Sep 17 00:00:00 2001 From: yeojin Date: Fri, 8 Nov 2024 15:04:31 +0900 Subject: [PATCH 44/52] =?UTF-8?q?Update=20Quiz:=20quiz=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5/=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finut_server/apiPayload/ApiResponse.java | 8 ++ .../controller/QuizController.java | 5 ++ .../finut/finut_server/domain/quiz/Quiz.java | 7 +- .../domain/quizDone/QuizDone.java | 32 +++---- .../domain/quizDone/QuizDoneId.java | 27 +++--- .../domain/quizDone/QuizDoneRepository.java | 6 +- .../finut_server/service/QuizDoneService.java | 25 +++--- .../finut_server/service/QuizService.java | 5 +- .../controller/QuizControllerTest.java | 88 ++++++++++++------- 9 files changed, 117 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/finut/finut_server/apiPayload/ApiResponse.java b/src/main/java/com/finut/finut_server/apiPayload/ApiResponse.java index 02c95aa..d9f3522 100644 --- a/src/main/java/com/finut/finut_server/apiPayload/ApiResponse.java +++ b/src/main/java/com/finut/finut_server/apiPayload/ApiResponse.java @@ -33,4 +33,12 @@ public static ApiResponse of(BaseCode code, T result){ public static ApiResponse onFailure(String code, String message, T data){ return new ApiResponse<>(true, code, message, data); } + + public String getData() { + return message; + } + + public String getStatusCode() { + return code; + } } diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index db32133..77d05e6 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -84,6 +84,11 @@ public ApiResponse> getQuiz(HttpServletRequest request, HttpServl @GetMapping("/correct/{quizId}") public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { Users user = usersService.getUserIdByToken(request, response); + + if (user == null) { + return ApiResponse.onFailure("401", "User not authenticated", "data"); + } + Optional quiz = quizService.getQuizByQuizId(quizId); if (quiz.isPresent()) { diff --git a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java index 9526193..2fc385a 100644 --- a/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java +++ b/src/main/java/com/finut/finut_server/domain/quiz/Quiz.java @@ -7,6 +7,7 @@ import jakarta.persistence.*; import lombok.*; +import java.util.List; import java.util.Set; @Entity @@ -37,5 +38,9 @@ public class Quiz extends BaseTimeEntity { private String description; // 정답 설명 @OneToMany(mappedBy = "quiz", cascade = CascadeType.ALL, orphanRemoval = true) - private Set quizDoneList; + private List quizDoneList; + + public Quiz(Long quizId, DifficultyType difficultyType, String question, AnswerType answerType) { + super(); + } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java index 28e1ccd..7f58e22 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDone.java @@ -3,41 +3,35 @@ import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.user.Users; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; -import java.util.Optional; +import java.io.Serializable; @Entity @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@IdClass(QuizDoneId.class) public class QuizDone { - @EmbeddedId - private QuizDoneId id; + @Id + private Long quizId; + + @Id + private Long userId; + + private Boolean isCorrect; @ManyToOne - @MapsId("quizId") @JoinColumn(name = "quizId", insertable = false, updatable = false) private Quiz quiz; @ManyToOne - @MapsId("userId") @JoinColumn(name = "userId", insertable = false, updatable = false) private Users user; - private Boolean isCorrect = false; - - // 추가 생성자 - 필요한 경우 사용 - public QuizDone(Users user, Quiz quiz, boolean isCorrect) { - this.id.setQuizId(quiz.getId()); - this.id.setUserId(user.getId()); - this.quiz = quiz; - this.user = user; - this.isCorrect = isCorrect; - } - - public QuizDone() { - - } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java index c9d331c..4609767 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneId.java @@ -1,35 +1,28 @@ package com.finut.finut_server.domain.quizDone; -import jakarta.persistence.Column; -import jakarta.persistence.Embeddable; +import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.util.Objects; +@Getter @Setter -@Embeddable -public class QuizDoneId implements Serializable { - - @Column(name = "quiz_id") +public class QuizDoneId implements Serializable { private Long quizId; - - @Column(name = "user_id") private Long userId; - // equals 메서드 + // Default constructor, hashCode, equals + @Override + public int hashCode(){ + return Objects.hash(quizId, userId); + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; QuizDoneId that = (QuizDoneId) o; - return Objects.equals(quizId, that.quizId) && - Objects.equals(userId, that.userId); - } - - // hashCode 메서드 - @Override - public int hashCode() { - return Objects.hash(quizId, userId); + return Objects.equals(quizId, that.quizId) && Objects.equals(userId, that.userId); } } diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java index f19c6d0..6a42238 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java @@ -3,11 +3,13 @@ import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.user.Users; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import java.util.Optional; +@EnableJpaRepositories public interface QuizDoneRepository extends JpaRepository { - boolean existsByIdQuizIdAndIdUserId(Long quizId, Long userId); + Optional findByQuizIdAndUserId(Long quizId, Long userId); - Optional findByIdUserId(Long userId); + Optional findByUserId(Long userId); } diff --git a/src/main/java/com/finut/finut_server/service/QuizDoneService.java b/src/main/java/com/finut/finut_server/service/QuizDoneService.java index 2e75704..2269626 100644 --- a/src/main/java/com/finut/finut_server/service/QuizDoneService.java +++ b/src/main/java/com/finut/finut_server/service/QuizDoneService.java @@ -8,8 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Optional; - @Service public class QuizDoneService { @@ -19,17 +17,18 @@ public class QuizDoneService { public void saveQuizDone(Users user, Quiz quiz, boolean isCorrect) { - QuizDone quizDone = new QuizDone(user, quiz, isCorrect); -// QuizDoneId quizDoneId = new QuizDoneId(); -// -// quizDoneId.setQuizId(quiz.getId()); -// quizDoneId.setUserId(user.getId()); -// -// quizDone.setId(quizDoneId); -// -// quizDone.setQuiz(quiz); -// quizDone.setUser(user); -// quizDone.setIsCorrect(isCorrect); + QuizDone quizDone = new QuizDone(); + QuizDoneId quizDoneId = new QuizDoneId(); + + quizDoneId.setQuizId(quiz.getId()); + quizDoneId.setUserId(user.getId()); + + quizDone.setQuizId(quiz.getId()); + quizDone.setUserId(user.getId()); + + quizDone.setQuiz(quiz); + quizDone.setUser(user); + quizDone.setIsCorrect(isCorrect); quizDoneRepository.save(quizDone); } diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index e079dae..1ab471e 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -8,6 +8,7 @@ import com.finut.finut_server.domain.user.UsersRepository; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -47,8 +48,8 @@ public Optional getQuiz(Long userId) { List allQuizzesByDiff = quizRepository.findByDifficulty(quizDiff); // 해당 사용자가 완료한 퀴즈 ID 목록 가져오기 - Set completedQuizIds = quizDoneRepository.findByIdUserId(userId).stream() - .map(quizDone -> quizDone.getQuiz().getId()) + Set completedQuizIds = quizDoneRepository.findByUserId(userId).stream() + .map(quizDone -> quizDone.getQuizId()) .collect(Collectors.toSet()); // 완료한 퀴즈는 제외한 남은 퀴즈 목록 생성 diff --git a/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java b/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java index 6752d7c..6b7c146 100644 --- a/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java +++ b/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java @@ -1,15 +1,23 @@ package com.finut.finut_server.controller; +import com.finut.finut_server.apiPayload.ApiResponse; +import com.finut.finut_server.domain.difficulty.DifficultyType; +import com.finut.finut_server.domain.quiz.AnswerType; import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.service.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.context.SpringBootTest; @@ -25,54 +33,70 @@ import static org.springframework.test.web.client.match.MockRestRequestMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@WebMvcTest(QuizController.class) +@ExtendWith(MockitoExtension.class) +@SpringBootTest public class QuizControllerTest { - @Autowired - private WebApplicationContext context; - @Autowired - - private MockMvc mockMvc; + @Mock + private UsersService usersService; - @MockBean + @Mock private QuizService quizService; - @MockBean + @Mock private QuizDoneService quizDoneService; - @MockBean - private UsersService usersService; + @InjectMocks + private QuizController quizController; - @MockBean - private GoogleAuthService googleAuthService; + @Test + public void testQuizCorrectSuccess() throws Exception { + // Arrange + Long quizId = 1L; + Users mockUser = new Users(); // 필요한 필드 초기화 + mockUser.setId(1L); // ID 설정 등 필요한 필드 추가 + Quiz mockQuiz = new Quiz(quizId, DifficultyType.LO, "question", AnswerType.TRUE); // 필요한 필드 초기화 + + HttpServletRequest mockRequest = mock(HttpServletRequest.class); + HttpServletResponse mockResponse = mock(HttpServletResponse.class); + + when(quizService.getQuizByQuizId(quizId)).thenReturn(Optional.of(mockQuiz)); + when(usersService.getUserIdByToken(mockRequest, mockResponse)) + .thenReturn(mockUser); + + // Act + ApiResponse response = quizController.quizCorrect(quizId, mockRequest, mockResponse); + + // Assert + assertEquals("success", response.getMessage()); + assertEquals("200", response.getStatusCode()); + + verify(quizDoneService).saveQuizDone(mockUser, mockQuiz, true); + verify(usersService).updateDiffLevelCnt(mockUser.getId()); + } - @BeforeEach - public void setUp() { - mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - } @Test - public void testQuizCorrectSuccess() throws Exception { - // Mock data + public void testQuizCorrectFailure_NoQuiz() throws Exception { + // Arrange Long quizId = 1L; - Users mockUser = new Users(); // Replace with actual Users object setup - Quiz mockQuiz = mock(Quiz.class); // Replace with actual Quiz object setup + Users mockUser = new Users(); + + HttpServletRequest mockRequest = mock(HttpServletRequest.class); + HttpServletResponse mockResponse = mock(HttpServletResponse.class); - // Mock behavior - when(usersService.getUserIdByToken(any(HttpServletRequest.class), any(HttpServletResponse.class))) - .thenReturn(mockUser); - when(quizService.getQuizByQuizId(quizId)).thenReturn(Optional.of(mockQuiz)); + when(usersService.getUserIdByToken(mockRequest, mockResponse)).thenReturn(mockUser); + when(quizService.getQuizByQuizId(quizId)).thenReturn(Optional.empty()); - // Perform test - mockMvc.perform(get("/correct/{quizId}", quizId) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect((ResultMatcher) jsonPath("$.message").value("success")); + // Act + ApiResponse response = quizController.quizCorrect(quizId, mockRequest, mockResponse); - // Verify that services were called as expected + // Assert + assertEquals("500", response.getStatusCode()); + assertEquals("No Quiz", response.getMessage()); - verify(quizDoneService, times(1)).saveQuizDone(mockUser, mockQuiz, true); - verify(usersService, times(1)).updateDiffLevelCnt(mockUser.getId()); + verify(quizDoneService, never()).saveQuizDone(any(), any(), anyBoolean()); + verify(usersService, never()).updateDiffLevelCnt(any()); } } From 2d9443e2bd99daacb7770811c9ab8773019fd237 Mon Sep 17 00:00:00 2001 From: yeojin Date: Sat, 9 Nov 2024 22:27:21 +0900 Subject: [PATCH 45/52] =?UTF-8?q?Update=20Quiz:=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/finut/finut_server/controller/QuestController.java | 2 ++ src/main/java/com/finut/finut_server/domain/quest/Quest.java | 2 ++ .../com/finut/finut_server/domain/quest/QuestRepository.java | 2 ++ .../finut/finut_server/domain/quizDone/QuizDoneRepository.java | 3 +++ src/main/java/com/finut/finut_server/service/QuizService.java | 2 +- 5 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/finut/finut_server/controller/QuestController.java create mode 100644 src/main/java/com/finut/finut_server/domain/quest/Quest.java create mode 100644 src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java diff --git a/src/main/java/com/finut/finut_server/controller/QuestController.java b/src/main/java/com/finut/finut_server/controller/QuestController.java new file mode 100644 index 0000000..f3fb307 --- /dev/null +++ b/src/main/java/com/finut/finut_server/controller/QuestController.java @@ -0,0 +1,2 @@ +package com.finut.finut_server.controller;public class QuestController { +} diff --git a/src/main/java/com/finut/finut_server/domain/quest/Quest.java b/src/main/java/com/finut/finut_server/domain/quest/Quest.java new file mode 100644 index 0000000..a987b8a --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quest/Quest.java @@ -0,0 +1,2 @@ +package com.finut.finut_server.domain.quest;public class Quest { +} diff --git a/src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java b/src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java new file mode 100644 index 0000000..d13ca7c --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java @@ -0,0 +1,2 @@ +package com.finut.finut_server.domain.quest;public interface QuestRepository { +} diff --git a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java index 6a42238..55fd171 100644 --- a/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quizDone/QuizDoneRepository.java @@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import java.util.List; import java.util.Optional; @EnableJpaRepositories @@ -12,4 +13,6 @@ public interface QuizDoneRepository extends JpaRepository Optional findByQuizIdAndUserId(Long quizId, Long userId); Optional findByUserId(Long userId); + + List findAllByUserId(Long userId); } diff --git a/src/main/java/com/finut/finut_server/service/QuizService.java b/src/main/java/com/finut/finut_server/service/QuizService.java index 1ab471e..eb8895f 100644 --- a/src/main/java/com/finut/finut_server/service/QuizService.java +++ b/src/main/java/com/finut/finut_server/service/QuizService.java @@ -48,7 +48,7 @@ public Optional getQuiz(Long userId) { List allQuizzesByDiff = quizRepository.findByDifficulty(quizDiff); // 해당 사용자가 완료한 퀴즈 ID 목록 가져오기 - Set completedQuizIds = quizDoneRepository.findByUserId(userId).stream() + Set completedQuizIds = quizDoneRepository.findAllByUserId(userId).stream() .map(quizDone -> quizDone.getQuizId()) .collect(Collectors.toSet()); From 9eff179b5ffbf59eed605954241745ba61719486 Mon Sep 17 00:00:00 2001 From: yeojin Date: Sat, 9 Nov 2024 22:50:34 +0900 Subject: [PATCH 46/52] =?UTF-8?q?Update=20Quest:=20=EC=A0=84=EC=B2=B4=20qu?= =?UTF-8?q?est=20=EC=B0=BE=EA=B8=B0,=20quest=EB=B3=84=20questQuiz=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuestController.java | 78 ++++++++++++++++++- .../finut_server/domain/quest/Quest.java | 28 ++++++- .../domain/quest/QuestRepository.java | 7 +- .../domain/questQuiz/QuestQuiz.java | 34 ++++++++ .../domain/questQuiz/QuestQuizRepository.java | 10 +++ .../service/QuestQuizService.java | 19 +++++ .../finut_server/service/QuestService.java | 18 +++++ 7 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java create mode 100644 src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuizRepository.java create mode 100644 src/main/java/com/finut/finut_server/service/QuestQuizService.java create mode 100644 src/main/java/com/finut/finut_server/service/QuestService.java diff --git a/src/main/java/com/finut/finut_server/controller/QuestController.java b/src/main/java/com/finut/finut_server/controller/QuestController.java index f3fb307..2dc0bda 100644 --- a/src/main/java/com/finut/finut_server/controller/QuestController.java +++ b/src/main/java/com/finut/finut_server/controller/QuestController.java @@ -1,2 +1,78 @@ -package com.finut.finut_server.controller;public class QuestController { +package com.finut.finut_server.controller; + +import com.finut.finut_server.apiPayload.ApiResponse; +import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; +import com.finut.finut_server.domain.quest.Quest; +import com.finut.finut_server.domain.questQuiz.QuestQuiz; +import com.finut.finut_server.domain.questQuiz.QuestQuizRepository; +import com.finut.finut_server.domain.quiz.Quiz; +import com.finut.finut_server.domain.user.Users; +import com.finut.finut_server.service.QuestQuizService; +import com.finut.finut_server.service.QuestService; +import com.finut.finut_server.service.UsersService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/quest") +@Tag(name = "Quest Controller", description = "퀘스트 관련 api") +public class QuestController { + @Autowired + private UsersService usersService; + + @Autowired + private QuestQuizService questQuizService; + + @Autowired + private QuestService questService; + + @Operation(summary = "전체 퀘스트 가져오기", description = "전체 퀘스트를 가져옵니다") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = Quiz.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("") + public ApiResponse> getQuests(HttpServletRequest request, HttpServletResponse response){ + List quests = questService.getAllQuests(); + return ApiResponse.onSuccess(quests); + } + + + @Operation(summary = "해당 퀘스트 퀴즈들 가져오기", description = "해당 퀘스트의 퀴즈을 모두 가져옵니다.") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = Quiz.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/{questId}") + public ApiResponse> getQuestQuizes(@PathVariable Long questId, HttpServletRequest request, HttpServletResponse response){ + List questQuizzes = questQuizService.getQuestQuizzes(questId); + return ApiResponse.onSuccess(questQuizzes); + } + + + } diff --git a/src/main/java/com/finut/finut_server/domain/quest/Quest.java b/src/main/java/com/finut/finut_server/domain/quest/Quest.java index a987b8a..becc9c8 100644 --- a/src/main/java/com/finut/finut_server/domain/quest/Quest.java +++ b/src/main/java/com/finut/finut_server/domain/quest/Quest.java @@ -1,2 +1,28 @@ -package com.finut.finut_server.domain.quest;public class Quest { +package com.finut.finut_server.domain.quest; + +import com.finut.finut_server.domain.BaseTimeEntity; +import com.finut.finut_server.domain.difficulty.DifficultyType; +import com.finut.finut_server.domain.questQuiz.QuestQuiz; +import jakarta.persistence.*; +import lombok.*; + +import java.util.List; + +@Entity +@Builder +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@ToString +public class Quest { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @OneToMany(mappedBy = "quest", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List quizzes; } diff --git a/src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java b/src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java index d13ca7c..616d9af 100644 --- a/src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java +++ b/src/main/java/com/finut/finut_server/domain/quest/QuestRepository.java @@ -1,2 +1,7 @@ -package com.finut.finut_server.domain.quest;public interface QuestRepository { +package com.finut.finut_server.domain.quest; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface QuestRepository extends JpaRepository { + } diff --git a/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java b/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java new file mode 100644 index 0000000..208b99e --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java @@ -0,0 +1,34 @@ +package com.finut.finut_server.domain.questQuiz; + +import com.finut.finut_server.domain.quest.Quest; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Builder +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@ToString +public class QuestQuiz { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private Long quizId; + + @Column(nullable = false) + private String question; + + @Column(nullable = false) + private String answer; + + @Column(nullable = false) + private String description; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "questId", insertable = false, updatable = false) + private Quest quest; +} diff --git a/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuizRepository.java b/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuizRepository.java new file mode 100644 index 0000000..6085353 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuizRepository.java @@ -0,0 +1,10 @@ +package com.finut.finut_server.domain.questQuiz; + + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface QuestQuizRepository extends JpaRepository { + List findByQuestId(Long questId); +} diff --git a/src/main/java/com/finut/finut_server/service/QuestQuizService.java b/src/main/java/com/finut/finut_server/service/QuestQuizService.java new file mode 100644 index 0000000..0cce8fc --- /dev/null +++ b/src/main/java/com/finut/finut_server/service/QuestQuizService.java @@ -0,0 +1,19 @@ +package com.finut.finut_server.service; + +import com.finut.finut_server.domain.questQuiz.QuestQuiz; +import com.finut.finut_server.domain.questQuiz.QuestQuizRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class QuestQuizService { + + @Autowired + private QuestQuizRepository questQuizRepository; + + public List getQuestQuizzes(Long questId) { + return questQuizRepository.findByQuestId(questId); + } +} diff --git a/src/main/java/com/finut/finut_server/service/QuestService.java b/src/main/java/com/finut/finut_server/service/QuestService.java new file mode 100644 index 0000000..b013c82 --- /dev/null +++ b/src/main/java/com/finut/finut_server/service/QuestService.java @@ -0,0 +1,18 @@ +package com.finut.finut_server.service; + +import com.finut.finut_server.domain.quest.Quest; +import com.finut.finut_server.domain.quest.QuestRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class QuestService { + @Autowired + private QuestRepository questRepository; + + public List getAllQuests() { + return questRepository.findAll(); + } +} From 1c7b28cac1ecb417676e7b13f31af3725a01bf7c Mon Sep 17 00:00:00 2001 From: yeojin Date: Mon, 11 Nov 2024 22:39:12 +0900 Subject: [PATCH 47/52] =?UTF-8?q?Update=20Quest:=20=ED=80=98=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=84=EC=B2=B4=20=EB=B3=B4=EA=B8=B0,=20?= =?UTF-8?q?=ED=80=98=EC=8A=A4=ED=8A=B8=20=ED=80=B4=EC=A6=88=20=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuestController.java | 11 ++++--- .../finut_server/domain/quest/Quest.java | 6 +++- .../finut_server/domain/quest/QuestDTO.java | 18 +++++++++++ .../domain/questDone/QuestDone.java | 19 ++++++++++++ .../domain/questDone/QuestDoneId.java | 16 ++++++++++ .../domain/questQuiz/QuestQuiz.java | 26 ++++++++++++---- .../finut_server/service/QuestService.java | 9 ++++-- src/main/resources/quest.sql | 6 ++++ src/main/resources/quest_quiz.sql | 30 +++++++++++++++++++ src/main/resources/quiz.sql | 16 ---------- 10 files changed, 128 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/finut/finut_server/domain/quest/QuestDTO.java create mode 100644 src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java create mode 100644 src/main/java/com/finut/finut_server/domain/questDone/QuestDoneId.java create mode 100644 src/main/resources/quest.sql create mode 100644 src/main/resources/quest_quiz.sql diff --git a/src/main/java/com/finut/finut_server/controller/QuestController.java b/src/main/java/com/finut/finut_server/controller/QuestController.java index 2dc0bda..64d05ff 100644 --- a/src/main/java/com/finut/finut_server/controller/QuestController.java +++ b/src/main/java/com/finut/finut_server/controller/QuestController.java @@ -3,6 +3,7 @@ import com.finut.finut_server.apiPayload.ApiResponse; import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.quest.Quest; +import com.finut.finut_server.domain.quest.QuestDTO; import com.finut.finut_server.domain.questQuiz.QuestQuiz; import com.finut.finut_server.domain.questQuiz.QuestQuizRepository; import com.finut.finut_server.domain.quiz.Quiz; @@ -43,7 +44,7 @@ public class QuestController { @Operation(summary = "전체 퀘스트 가져오기", description = "전체 퀘스트를 가져옵니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = Quiz.class))), + schema = @Schema(implementation = Quest.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -51,8 +52,8 @@ public class QuestController { schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("") - public ApiResponse> getQuests(HttpServletRequest request, HttpServletResponse response){ - List quests = questService.getAllQuests(); + public ApiResponse> getQuests(HttpServletRequest request, HttpServletResponse response){ + List quests = questService.getAllQuests(); return ApiResponse.onSuccess(quests); } @@ -60,7 +61,7 @@ public ApiResponse> getQuests(HttpServletRequest request, HttpServle @Operation(summary = "해당 퀘스트 퀴즈들 가져오기", description = "해당 퀘스트의 퀴즈을 모두 가져옵니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", - schema = @Schema(implementation = Quiz.class))), + schema = @Schema(implementation = QuestQuiz.class))), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", @@ -75,4 +76,6 @@ public ApiResponse> getQuestQuizes(@PathVariable Long questId, H + + } diff --git a/src/main/java/com/finut/finut_server/domain/quest/Quest.java b/src/main/java/com/finut/finut_server/domain/quest/Quest.java index becc9c8..b6d4b1f 100644 --- a/src/main/java/com/finut/finut_server/domain/quest/Quest.java +++ b/src/main/java/com/finut/finut_server/domain/quest/Quest.java @@ -1,7 +1,9 @@ package com.finut.finut_server.domain.quest; +import com.fasterxml.jackson.annotation.JsonManagedReference; import com.finut.finut_server.domain.BaseTimeEntity; import com.finut.finut_server.domain.difficulty.DifficultyType; +import com.finut.finut_server.domain.level.LevelName; import com.finut.finut_server.domain.questQuiz.QuestQuiz; import jakarta.persistence.*; import lombok.*; @@ -21,8 +23,10 @@ public class Quest { private Long id; @Column(nullable = false) - private String title; + @Enumerated(EnumType.STRING) + private LevelName nextLevel; @OneToMany(mappedBy = "quest", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + @JsonManagedReference private List quizzes; } diff --git a/src/main/java/com/finut/finut_server/domain/quest/QuestDTO.java b/src/main/java/com/finut/finut_server/domain/quest/QuestDTO.java new file mode 100644 index 0000000..928536c --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/quest/QuestDTO.java @@ -0,0 +1,18 @@ +package com.finut.finut_server.domain.quest; + +import com.finut.finut_server.domain.level.LevelName; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class QuestDTO { + private Long id; + private LevelName nextLevel; + +} diff --git a/src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java b/src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java new file mode 100644 index 0000000..67ce732 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java @@ -0,0 +1,19 @@ +package com.finut.finut_server.domain.questDone; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@IdClass(QuestDoneId.class) +public class QuestDone { + @Id + private Long questId; + + @Id + private Long userId; +} diff --git a/src/main/java/com/finut/finut_server/domain/questDone/QuestDoneId.java b/src/main/java/com/finut/finut_server/domain/questDone/QuestDoneId.java new file mode 100644 index 0000000..77075e6 --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/questDone/QuestDoneId.java @@ -0,0 +1,16 @@ +package com.finut.finut_server.domain.questDone; + +import java.io.Serializable; + +public class QuestDoneId implements Serializable { + private Long questId; + private Long userId; + + public QuestDoneId() {} + + public QuestDoneId(Long questId, Long userId) { + this.questId = questId; + this.userId = userId; + } +} + diff --git a/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java b/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java index 208b99e..ab30005 100644 --- a/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java +++ b/src/main/java/com/finut/finut_server/domain/questQuiz/QuestQuiz.java @@ -1,5 +1,6 @@ package com.finut.finut_server.domain.questQuiz; +import com.fasterxml.jackson.annotation.JsonBackReference; import com.finut.finut_server.domain.quest.Quest; import jakarta.persistence.*; import lombok.*; @@ -15,20 +16,33 @@ public class QuestQuiz { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; +// +// @Column(nullable = false) +// private Long quizId; - @Column(nullable = false) - private Long quizId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "quest_id", insertable = false, updatable = false) + @JsonBackReference + private Quest quest; @Column(nullable = false) private String question; @Column(nullable = false) - private String answer; + private String option1; @Column(nullable = false) + private String option2; + + @Column(nullable = false) + private String option3; + + @Column(nullable = false) + private Integer correctOption; + + @Column(nullable = false, columnDefinition = "TEXT") + @Lob private String description; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "questId", insertable = false, updatable = false) - private Quest quest; + } diff --git a/src/main/java/com/finut/finut_server/service/QuestService.java b/src/main/java/com/finut/finut_server/service/QuestService.java index b013c82..60e6da4 100644 --- a/src/main/java/com/finut/finut_server/service/QuestService.java +++ b/src/main/java/com/finut/finut_server/service/QuestService.java @@ -1,18 +1,23 @@ package com.finut.finut_server.service; import com.finut.finut_server.domain.quest.Quest; +import com.finut.finut_server.domain.quest.QuestDTO; import com.finut.finut_server.domain.quest.QuestRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; @Service public class QuestService { @Autowired private QuestRepository questRepository; - public List getAllQuests() { - return questRepository.findAll(); + public List getAllQuests() { + List quests= questRepository.findAll(); + return quests.stream() + .map(quest -> new QuestDTO(quest.getId(), quest.getNextLevel())) + .collect(Collectors.toList()); } } diff --git a/src/main/resources/quest.sql b/src/main/resources/quest.sql new file mode 100644 index 0000000..93ec891 --- /dev/null +++ b/src/main/resources/quest.sql @@ -0,0 +1,6 @@ +INSERT INTO Quest (next_level) VALUES ('INTERN'); +INSERT INTO Quest (next_level) VALUES ('STAFF'); +INSERT INTO Quest (next_level) VALUES ('ASSOCIATEMANAGER'); +INSERT INTO Quest (next_level) VALUES ('MANAGER'); +INSERT INTO Quest (next_level) VALUES ('SENIORMANAGER'); +INSERT INTO Quest (next_level) VALUES ('DIRECTOR'); \ No newline at end of file diff --git a/src/main/resources/quest_quiz.sql b/src/main/resources/quest_quiz.sql new file mode 100644 index 0000000..ed50073 --- /dev/null +++ b/src/main/resources/quest_quiz.sql @@ -0,0 +1,30 @@ +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서를 작성하는 가장 중요한 이유는 무엇인가요?','회사가 요구하는 예의와 규범을 알기 위해','근로 조건과 관련된 불필요한 분쟁을 예방하기 위해','회사 정책에 대한 전반적인 이해를 돕기 위해',2,'근로계약서는 근로기준법에 따라 필수적으로 작성해야 하며, 이는 근로자와 회사 간의 권리와 의무를 명확히 정리해줍니다. 예를 들어, 임금이 제때 지급되지 않는 문제가 발생할 경우, 근로계약서에 명시된 내용에 따라 법적으로 해결할 수 있습니다. 계약서를 통해 근로자는 자신의 권리를 보호받을 수 있으며, 이를 통해 회사와의 불필요한 갈등을 줄일 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서에 반드시 포함되어야 하는 항목이 아닌 것은 무엇인가요?','임금','근로시간','회사의 비전과 목표',3,'근로계약서에는 근로자가 받아야 할 기본적인 근로 조건이 포함되어야 하며, 대표적인 예로 임금, 근로시간, 휴가, 업무 내용 등이 있습니다. 반면, 회사의 비전과 목표는 근로계약서의 필수 항목이 아니며, 이는 주로 직원들이 회사의 방향성을 이해하도록 설명 자료나 교육 시간에 제공됩니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서에 임금 지급일이 포함되어야 하는 이유는 무엇인가요','급여 관리에 대한 회사의 계획을 이해하기 위해','근로자가 급여 지급 일정을 명확히 인지하기 위해','임금 산정 방식을 안내하기 위해',2,'근로기준법 제36조에 따르면 임금은 일정한 지급일에 맞춰 지급되어야 합니다. 이를 명시하지 않으면 근로자는 임금이 언제 지급될지 모호해지고, 자칫 임금이 연체되는 경우도 발생할 수 있습니다. 예를 들어, 매월 10일에 급여가 지급되는 회사의 경우, 근로계약서에 이 날짜가 명시되어 있으면 근로자는 매달 임금이 언제 지급될지 확실히 알 수 있습니다. 이는 불필요한 불만과 법적 분쟁을 예방하는 데 도움이 됩니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서에 포함해야 하는 필수 항목 중 하나는 무엇인가요?','근로자의 직무 수행에 필요한 자격 요건','근로 장소 및 업무의 내용','근로자의 업무 성과 평가 기준',2,'근로계약서에는 반드시 근로 장소와 담당 업무가 명시되어야 합니다. 이는 근로기준법에 따라 근로자가 어떤 업무를 어디서 수행할지를 명확히 이해하고 고용 조건을 수용할 수 있도록 하는 중요한 요소입니다. 예를 들어, 근로자는 계약서에 특정 근로 장소가 명시되어 있으면, 추후 다른 지점으로의 근무를 요구받더라도 원래 근로 장소를 근거로 협의할 수 있습니다. 반면, 자격 요건이나 업무 성과 평가 기준은 직무 설명서나 별도의 평가 지표로 제시될 수 있지만, 근로계약서의 필수 항목은 아닙니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서 작성 시 계약 종료 조건을 명확히 하는 이유는 무엇인가요?','계약 기간을 연장하거나 조정할 가능성을 열어두기 위해','근로자가 계약이 끝나는 시점에 대해 정확히 알기 위해','근로자가 필요한 경우 자유롭게 그만둘 수 있도록 하기 위해',2,'계약 기간이나 종료 조건은 근로자가 근로 관계가 언제 끝나는지 알 수 있도록 계약서에 명시되어야 합니다. 예를 들어, 1년 계약직 근로자인 경우, 근로계약서에 근무 시작일과 종료일이 명시되어 있어야 근로자는 언제까지 고용될지 알 수 있습니다. 이 조건이 명확하지 않으면 근로자는 고용 상태의 불안정성을 느끼게 되고, 회사 측에서도 불필요한 분쟁을 초래할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (2,'대출계약서에서 대출이자를 정확히 확인해야 하는 이유는 무엇인가요?','대출 기간 중 이자율이 변동할 수 있기 때문에','대출 이자는 원금 상환 시 자동으로 사라지기 때문에','이자율이 계약서에 표기되지 않으면 고정 이자로 간주되기 때문에',1,'대출 계약서에는 이자율과 이자율의 변동 조건이 명확히 표기되어야 합니다. 변동금리 대출의 경우, 시장 상황에 따라 이자율이 달라질 수 있어 이를 확인하지 않으면 갑작스럽게 이자가 증가할 위험이 있습니다. 예를 들어, 2년 후 기준금리가 상승하면서 이자율이 올라가면 대출자의 상환 부담이 증가할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (2,'대출계약서에 표기된 "연체 이자"를 정확히 파악해야 하는 이유는 무엇인가요?','연체 이자는 1년에 한 번만 부과되기 때문에','연체 시 추가적인 비용 발생을 줄이기 위해','연체 이자율이 낮을수록 상환 부담이 늘어나기 때문에',1,'대출 계약서에는 연체 이자율이 명시되어 있어야 합니다. 연체 이자는 상환 기일을 초과할 경우 부과되는 추가 비용이므로 이를 정확히 확인해야 불필요한 비용을 피할 수 있습니다. 예를 들어, 연체 이자율이 원래 이자율보다 높다면, 연체 시 이자 비용이 급격히 증가할 수 있어 상환에 어려움을 겪게 됩니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (2,'보험계약서에서 "면책 사항"을 확인해야 하는 이유는 무엇인가요?','보험료가 계약서에 명시된 금액 이상으로 청구될 수 있기 때문에','특정 상황에서는 보상을 받지 못할 수 있기 때문에','보험 혜택이 갱신될 때마다 변동할 수 있기 때문에',2,'보험계약서에는 보상이 이루어지지 않는 면책 사항이 명시되어 있습니다. 예를 들어, 자동차 보험의 경우, 음주 운전 시 발생한 사고에 대해서는 보상이 이루어지지 않는다는 조항이 있을 수 있습니다. 이를 사전에 이해하지 않으면 예상치 못한 사고 발생 시 보상을 받지 못해 큰 경제적 부담을 질 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (2,'보험계약서에서 "보험금 지급 기준"을 확인하는 이유는 무엇인가요?','보험금이 지급되는 최소 금액을 알아야 하기 때문에','사고나 질병 발생 시 보험금 지급 여부와 지급액이 결정되기 때문에','보험 가입자가 언제든지 계약을 취소할 수 있기 때문에',2,'보험계약서에 명시된 보험금 지급 기준을 통해, 특정 사고나 질병에 대해 보험금이 지급되는 조건과 지급 금액이 결정됩니다. 예를 들어, 생명보험의 경우 사망 시 보장금이 지급되지만, 사망 원인이 면책 사유에 해당되면 지급이 거부될 수 있습니다. 이를 명확히 파악하지 않으면 필요할 때 보험 혜택을 받지 못하는 상황이 발생할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (2,'보험계약서에서 "해지 환급금" 조항을 확인해야 하는 이유는 무엇인가요?','계약 해지 시 일부 환급금이 지급될 수 있기 때문에','환급금이 있으면 보험료가 낮아지기 때문에','환급금을 받으면 보험이 자동으로 갱신되기 때문에',1,'보험계약서에 명시된 해지 환급금은 계약 해지 시 보험사가 가입자에게 지급하는 환급금입니다. 보험 기간 중간에 해지하게 되면 일정 비율의 보험료가 환급될 수 있습니다. 예를 들어, 장기 보험에 가입했다가 중도 해지할 경우, 해지 환급금이 얼마인지 정확히 알아야 손해를 최소화할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (3,'임대차계약서에서 계약 기간을 명확히 설정해야 하는 이유는 무엇인가요?','임대인은 계약 기간 중 임차인을 임의로 퇴거시킬 수 있기 때문에','임차인은 계약 기간 중 임대료를 임의로 조정할 수 있기 때문에','계약 종료 후 갱신 여부나 임대 조건이 자동으로 변경될 수 있기 때문에',3,'임대차계약서에서 계약 기간을 명확히 설정하면 계약 종료 시점에 갱신 여부를 결정할 수 있으며, 임대료나 조건에 대한 협상이 가능합니다. 예를 들어, 계약 기간이 명확하지 않으면 임대인이 계약을 갱신하면서 임대료를 인상할 때 임차인에게 불리하게 작용할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (3,'임대차계약서에서 보증금 반환에 대한 조항을 꼼꼼히 확인해야 하는 이유는 무엇인가요?','임대인은 보증금을 임의로 사용할 수 있기 때문에','임대인은 임차인 요청 시 보증금을 일부만 반환할 수 있기 때문에','계약 종료 시 보증금 반환 시점이나 조건이 명확하지 않으면 분쟁이 발생할 수 있기 때문에',3,'임대차계약서에는 보증금 반환 조건이 명시되어 있어야 합니다. 예를 들어, 계약이 종료된 후 임차인이 원상복구를 마친 상태에서 보증금을 반환받지 못하는 경우가 발생할 수 있습니다. 따라서 반환 시점과 조건을 명확히 기재해야 임대인과 임차인 간의 분쟁을 줄일 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (3,'보험계약서에서 "면책 기간"을 확인해야 하는 이유는 무엇인가요?','면책 기간 동안 보험금을 청구할 수 없기 때문에','면책 기간이 지나면 보험료가 인상되기 때문에','면책 기간 동안에는 보상 금액이 축소되기 때문에',1,'면책 기간은 보험 가입 후 일정 기간 동안 보험금 청구가 불가능한 기간을 의미합니다. 예를 들어, 암 보험의 경우 가입 후 초기 면책 기간 동안에는 암 진단을 받아도 보험금을 청구할 수 없습니다. 이를 미리 인지하지 못하면 예상치 못한 상황에서 보상을 받지 못할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (3,'보험계약서의 "감액 지급" 조항이 적용될 수 있는 상황은 무엇인가요?','보험 가입 기간 중 추가 보험료를 납부하지 않았을 때','사고 원인이 면책 사유에 해당하지 않는 경우','보험 사고 발생 시점에 특정 조건이 충족되지 않았을 때',3,'감액 지급은 보험 사고가 발생했지만 계약에서 요구하는 특정 조건을 완전히 충족하지 못한 경우 보험금이 감액되어 지급되는 조항입니다. 예를 들어, 특정 질병 진단 시 병원 입원 일수가 기준에 미치지 못하면 보험금이 줄어들 수 있습니다. 이를 숙지하지 않으면 예상보다 적은 보험금을 받게 될 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (3,'"소멸 시효"에 따라 보험금 청구를 할 수 없는 경우가 발생할 수 있습니다. 소멸 시효가 중요한 이유는 무엇인가요?','소멸 시효가 지나면 보험계약 자체가 해지되기 때문에','소멸 시효가 지나면 보험료 납부가 중단되기 때문에','소멸 시효가 지나면 보험금을 청구할 권리가 소멸되기 때문에',3,'보험금 청구에는 법적으로 소멸 시효가 적용됩니다. 예를 들어, 생명보험의 경우 사고 발생일로부터 3년 이내에 보험금을 청구해야 하며, 이를 넘기면 보험금을 받을 권리가 사라집니다. 이를 미리 인지하고 있어야 시효가 지나 보험금을 청구하지 못하는 불이익을 방지할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (4,'펀드 투자 계약서에서 "투자 원금 보장 여부"를 확인하는 이유는 무엇인가요?','펀드는 원금 보장이 기본적으로 포함되어 있기 때문에','일부 펀드는 원금 보장이 없을 수 있기 때문에','원금 보장이 없으면 투자 수익률이 자동으로 높아지기 때문에',2,'대부분의 펀드 상품은 원금을 보장하지 않으며, 이는 투자자에게 중요한 리스크 요소입니다. 예를 들어, 주식형 펀드는 주식 시장의 변동에 따라 원금 손실이 발생할 수 있으므로, 투자자는 계약서에서 원금 보장 여부를 반드시 확인해야 합니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (4,'금융 투자 계약서에서 "수수료 및 비용" 항목을 확인해야 하는 이유는 무엇인가요?','수수료가 높으면 이익이 커지기 때문에','일부 펀드는 수수료를 청구하지 않기 때문에','수수료와 기타 비용이 투자 수익률에 큰 영향을 줄 수 있기 때문에',3,'펀드 및 주식 투자 시 발생하는 운용 수수료, 매매 수수료 등이 투자 수익률에 영향을 미칩니다. 예를 들어, 수익이 낮은 상황에서도 수수료는 정해진 비율로 차감되므로, 이를 미리 파악하지 않으면 기대 수익보다 낮은 수익을 얻게 될 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (4,'주식 투자 계약서에서 "매도 제한 조건"을 확인해야 하는 이유는 무엇인가요?','특정 주식은 일정 기간 동안 매도할 수 없을 수 있기 때문에','매도 제한 조건이 있으면 배당 수익이 보장되기 때문에','매도 제한이 있으면 매도 시점에 자동으로 수수료가 면제되기 때문에',1,'일부 주식은 상장 직후 일정 기간 동안 매도가 제한될 수 있으며, 이는 투자자의 유동성을 제한하는 요소가 됩니다. 예를 들어, IPO(기업 공개) 주식의 경우 상장 후 일정 기간 동안 대주주가 매도하지 못하도록 제한하는 ''락업(lock-up)'' 조항이 있을 수 있습니다. 이를 이해하지 못하면 예상치 못한 상황에서 주식을 처분하지 못하는 경우가 발생할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (4,'청약 계약서에서 "청약 철회 가능 기간"을 반드시 확인해야 하는 이유는 무엇인가요?','청약 철회 가능 기간이 지나면 청약을 철회할 수 없기 때문에','청약 철회 가능 기간이 지나면 위약금이 발생하기 때문에','청약 철회 기간이 지나면 청약 자격을 잃게 되기 때문에',1,'청약 철회 가능 기간이 지나면 청약을 철회하고자 하더라도 법적으로 불가능하게 됩니다. 예를 들어, 주택 청약의 경우 일반적으로 계약 체결 후 3일 이내에 철회할 수 있으며, 이 기간이 지나면 위약금 없이 청약을 취소하는 것이 어려울 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (4,'청약 계약서에서 "청약 신청금"의 환불 조건을 확인하는 이유는 무엇인가요?','신청금은 청약 철회 시에도 환불되지 않기 때문에','환불 조건에 따라 신청금을 전액 돌려받지 못할 수 있기 때문에','환불이 되면 자동으로 계약이 해지되기 때문에',2,'청약 철회 시, 신청금 환불 조건을 미리 확인하지 않으면 일부만 환불되거나 환불이 불가능한 경우가 있을 수 있습니다. 예를 들어, 청약 신청 후 계약을 철회할 경우, 일부 청약금은 위약금으로 차감되거나, 환불 조건에 따라 반환 금액이 제한될 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (5,'자동차 매매 계약서에서 차량 상태 점검 내역을 확인해야 하는 중요한 이유는 무엇인가요?','차량 상태에 따라 계약 후 수리비가 발생할 수 있기 때문에','차량 상태가 양호하면 계약 취소가 어려워지기 때문에','점검 내역에 따라 차량 보험료가 자동으로 조정되기 때문에',1,'자동차 매매 계약서에는 차량 상태가 명확히 기재되어 있어야 하며, 이를 통해 계약 후 수리비 부담을 줄일 수 있습니다. 예를 들어, 사고 차량을 사게 되는 경우, 수리비가 예기치 않게 발생할 수 있으므로, 구매 전에 점검 내역을 철저히 확인하여 예상치 못한 비용 부담을 피해야 합니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (5,'자동차 매매 계약서에서 "소유권 이전일"을 명확히 설정해야 하는 이유는 무엇인가요?','소유권 이전일이 없으면 자동차 등록이 자동으로 취소되기 때문에','소유권 이전일 이후부터 차량에 대한 책임이 구매자에게 있기 때문에','소유권 이전일이 늦어지면 자동차 보험 가입이 제한되기 때문에',2,'자동차 매매 계약서에 소유권 이전일을 명확히 기재해야 하는 이유는, 소유권 이전일 이후부터 차량에 대한 모든 법적, 금전적 책임이 구매자에게 전가되기 때문입니다. 예를 들어, 소유권 이전일 이후 발생한 사고나 벌금은 구매자가 책임을 져야 하므로, 이전일을 정확히 정해 책임 소재를 분명히 해야 합니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (5,'자동차 매매 계약서에서 차량 등록세와 관련된 사항을 확인하는 이유는 무엇인가요?','등록세는 이전 소유자가 자동으로 납부하기 때문','등록세는 구매자가 납부해야 할 추가 비용이기 때문','등록세를 납부하지 않으면 차량 번호판이 발급되지 않기 때문',2,'자동차 등록세는 일반적으로 구매자가 부담하는 비용이며, 이는 계약 후 차량 소유권을 이전하기 위해 필수적으로 납부해야 합니다. 만약 계약 단계에서 이를 인지하지 못하면 예상하지 못한 추가 비용으로 인해 재정적인 부담이 생길 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (5,'펀드 투자 계약서에서 "투자 위험 등급"을 확인해야 하는 이유는 무엇인가요?','위험 등급이 높을수록 원금 보장이 되기 때문에','위험 등급에 따라 예상 수익률이 달라지기 때문에','위험 등급에 따라 추가 비용이 발생할 수 있기 때문에',2,'펀드 상품은 위험 등급에 따라 투자 성향이 달라지며, 이는 수익률에도 큰 영향을 미칩니다. 예를 들어, 고위험 등급의 펀드는 주식이나 파생상품에 많이 투자하여 수익이 높을 수 있지만, 반대로 원금 손실의 위험도 큽니다. 따라서 자신의 투자 성향에 맞는 위험 등급을 선택하는 것이 중요합니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (5,'주식 투자 계약서에서 "배당금 지급 조건"을 확인해야 하는 이유는 무엇인가요?','배당금 지급 조건이 있으면 주식 매도 제한이 생기기 때문에','특정 조건을 충족해야만 배당금을 받을 수 있기 때문에','배당금 지급 조건에 따라 배당 수익이 자동으로 재투자되기 때문에',2,'주식 배당금은 일정 조건을 충족해야 받을 수 있으며, 이는 계약서에 명시되어야 합니다. 예를 들어, 특정 주식을 배당 기준일에 보유하고 있어야 배당금을 받을 수 있는 경우가 있습니다. 배당 조건을 이해하지 못하면 예상했던 배당 수익을 받지 못할 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'펀드 투자 계약서에서 "성과보수" 항목을 확인해야 하는 이유는 무엇인가요?','펀드 성과가 좋을 때 추가적인 보수를 투자자가 지급해야 할 수 있기 때문에','성과보수는 펀드 운용사에게만 적용되는 항목이기 때문에','성과보수 조항이 있으면 투자자가 부담하는 기본 수수료가 사라지기 때문에',1,'일부 펀드는 성과보수를 부과하는데, 이는 펀드가 일정 기준 이상의 수익률을 달성할 경우 추가적으로 부과되는 수수료입니다. 예를 들어, 목표 수익률이 10%로 설정된 펀드가 15%의 성과를 거두면, 5% 초과 성과에 대해 일정 비율의 성과보수가 부과될 수 있습니다. 성과보수 조건을 이해하지 못하면 예상 수익보다 낮은 수익을 실현하게 될 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'주식 투자 계약서에서 "콜옵션" 조항을 포함하는 경우, 이를 주의 깊게 확인해야 하는 이유는 무엇인가요?','콜옵션이 발동되면 주식을 일정 가격에 매도해야 할 수 있기 때문에','콜옵션은 주식 가격이 떨어질 때 자동으로 발동되기 때문에','콜옵션이 발동되면 배당금 지급 조건이 취소되기 때문에',1,'콜옵션 조항이 있는 경우, 특정 조건 하에서 투자자가 보유한 주식을 사전에 정해진 가격으로 매도해야 할 수 있습니다. 예를 들어, 기업이 투자자에게 주식을 콜옵션을 통해 되사들일 수 있는 권리를 가지면, 주가 상승 시에도 미리 정해진 가격에 매도해야 하는 상황이 발생할 수 있습니다. 이러한 조항을 이해하지 못하면 예상보다 낮은 가격에 주식을 팔아야 하는 상황이 올 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'펀드 투자 계약서에서 "환매 수수료"를 확인해야 하는 이유는 무엇인가요?','환매 시점에 따라 수수료가 증가하기 때문에','환매 수수료는 투자자 보호 차원에서 무료로 제공되기 때문에','환매 수수료는 투자 시점과 환매 시점의 시장 상황에 따라 달라질 수 있기 때문에',1,'펀드의 환매 수수료는 펀드를 매도하는 시점에 따라 차등적으로 적용되며, 일반적으로 투자 기간이 짧을수록 수수료가 높아지는 경향이 있습니다. 예를 들어, 6개월 내 환매 시 2%의 수수료가 부과되지만, 1년 이상 보유하면 수수료가 없어지는 식으로 설정될 수 있습니다. 이를 잘못 이해하면 단기 투자에서 예상보다 높은 비용을 부담하게 될 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'주식 투자 계약서에서 "우선 매수권" 조항을 확인해야 하는 이유는 무엇인가요?','우선 매수권 조항이 있으면 투자자가 원하는 시점에 추가 주식을 매수할 수 있기 때문에','기존 주주가 특정 주식 매도 시 우선적으로 해당 주식을 매수할 수 있기 때문에','우선 매수권 조항이 있는 경우, 추가 투자 시 발생하는 세금이 면제되기 때문에',2,'우선 매수권은 기존 주주가 보유한 주식을 제3자에게 매도하기 전에 다른 주주에게 먼저 매수할 기회를 제공하는 권리입니다. 예를 들어, 특정 주식의 대주주가 지분을 처분할 때, 기존 주주는 우선 매수권을 행사하여 지분율을 유지하거나 지분율을 높일 수 있습니다. 이를 이해하지 못하면 우선 매수권을 행사할 기회를 놓치거나 의도치 않게 주식 지분율이 낮아질 수 있습니다.'); +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'펀드 계약서에 명시된 "헤지 전략"을 파악해야 하는 이유는 무엇인가요?','헤지 전략을 사용하면 펀드의 위험을 줄이기 위해 추가 비용이 발생할 수 있기 때문에','헤지 전략을 사용할 경우 일정 금액 이상의 원금이 보장되기 때문에','헤지 전략은 펀드가 특정 주식에 집중 투자하는 방식을 의미하기 때문에',1,'헤지 전략은 위험을 줄이기 위해 파생상품을 이용하거나 반대 포지션을 취하는 전략으로, 이러한 전략에는 추가 비용이 발생할 수 있습니다. 예를 들어, 해외 주식 펀드가 환율 변동 위험을 줄이기 위해 선물 계약을 사용하면 헤지 비용이 발생하며, 이는 전체 수익에 영향을 미칠 수 있습니다. 헤지 전략을 이해하지 못하면 예상보다 낮은 순이익을 얻게 될 수 있습니다.'); \ No newline at end of file diff --git a/src/main/resources/quiz.sql b/src/main/resources/quiz.sql index 1772e4e..82093c5 100644 --- a/src/main/resources/quiz.sql +++ b/src/main/resources/quiz.sql @@ -8,37 +8,21 @@ insert into finut.quiz(difficulty, question, answer, description) values ("MI", insert into finut.quiz(difficulty, question, answer, description) values ("LO", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말합니다.", "TRUE", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말해요."); insert into finut.quiz(difficulty, question, answer, description) values ("HI", "bp(베이시스포인트)는 0.01%p의 움직임도 금융시장에 큰 영향을 미칩니다.", "TRUE", "기준금리 뉴스에 자주 등장하는 ‘bp’는 ‘basis point’의 약자예요. 금융에서 쓰이는 기본단위로, 금리나 수익률, 환율을 나타낼 때 사용합니다. 일반적으로 사용하는 백분율이 아닌 ‘만분율’ 단위의 움직임을 표현하는데요. 1bp는 0.01%p, 10bp는 0.1%p, 100bp는 1%p예요. 금융시장에서는 0.01%p의 움직임도 영향력이 커요. 그래서 0.01%p도 뉴스에 자주 언급됩니다. 백분율을 기준으로 ‘퍼센트포인트’라고 말하는 것보다 만분율을 기준으로 bp로 나타내는 것이 정보전달에 더 효율적이라서 사용한다는 얘기가 있어요."); - insert into finut.quiz(difficulty, question, answer, description) values ("MI", "DSR은 내 소득 대비 금융부채 원리금 상환비율로, 40%를 넘는 경우에는 대출을 해주지 않는다.", "TRUE", "DSR(Debt Service Ratio)은 내 소득 대비 금융부채 원리금 상환비율이에요. DSR 40%라면 내 연 소득이 1억 원일 때, 1년 동안의 원금과 이자 상환비율이 4천만 원을 넘지 않는 정도까지 대출을 해준다는 뜻이에요."); - insert into finut.quiz(difficulty, question, answer, description) values ("LO", "DTI(총부채상환비율)는 연 소득 대비 금융비용 부담률을 나타내는 지표입니다.", "TRUE", "DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. DTI는 ‘나의 연소 득’에서 ‘주택담보대출의 원금 상환과 이자, 다른 대출의 이자로 나가는 금액’이 차지하는 비중으로 구합니다. 내가 가진 모든 대출의 원리금 상환금액을 합쳐 따지는 DSR보다는 유한 기준입니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("HI", "ESG는 환경, 사회, CORPORATE GOVERNANCE에 대한 고려를 의미합니다.", "TRUE", "ESG는 Environmental(환경), Social(사회), Governance(지배구조)의 첫 글자를 조합한 단어로 기업의 친환경 경영, 사회적 책임, 투명한 지배구조 등을 의미합니다."); insert into finut.quiz(difficulty, question, answer, description) values ("MI", "ETF는 특정 주식에 대한 투자 상품이 아니다.", "TRUE", "ETF(Exchange Traded Fund)는 말 그대로 인덱스펀드를 거래소에 상장시켜 투자자들이 주식처럼 편리하게 거래할 수 있도록 만든 상품입니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("LO", "G7은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최하는 7개국을 의미합니다.", "TRUE", "G7. Group of Seven Summit. 주요 7개국 정상회담의 약자입니다. 미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본 7개국은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최해요. 이 회담뿐만 아니라 이 회담에 참여하는 7개국을 G7이라고 줄여 부르기도 해요."); - insert into finut.quiz(difficulty, question, answer, description) values ("HI", "GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 것이다.", "TRUE", "GNI는 Gross National Income의 약자로, ‘국민총소득’입니다. GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 거예요. 우리나라에 거주하고 있는 외국인의 소득은 제외하고, 외국에 거주하는 우리나라 국민의 소득을 포함해요. GNI를 구하는 가장 큰 이유는 국가가 아니라 국민들의 생활 수준을 알아보기 위해서예요. GNI와 유사한 지표로는 GDP가 있어요."); - insert into finut.quiz(difficulty, question, answer, description) values ("MI", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 방식으로 진행되는 것이다.", "TRUE", "GVC 후방참여율은 해외에서 수입한 중간재를 이용해 상품을 생산하고, 이를 다시 수출하는 비율을 말해요. 이 수치가 높은 나라일수록 전 세계 자원이 거쳐가는 글로벌 생산기지라 할 수 있어요."); - insert into finut.quiz(difficulty, question, answer, description) values ("LO", "LTV는 주택담보대출의 대출가능금액을 산출할 때 사용되는 공식입니다.", "TRUE", "LTV는 주택담보대출비율(Loan to Value ratio)입니다. 공식은 ‘(대출한 금액) / (아파트 가치)*100’이에요. 즉, 총 아파트 가치에 비교한 대출금의 비중을 보여줘요."); - insert into finut.quiz(difficulty, question, answer, description) values ("HI", "M&A(인수합병)는 기업이 다른 기업의 경영권을 획득하고자 하는 인수와 다른 기업의 소유권을 획득하고자 하는 합병을 합한 개념입니다.", "TRUE", "M&A는 ‘Merger(합병)&Accquisition(인수)’의 약자로, 인수와 합병을 통해 회사 규모를 키우거나 시장에서 빠르게 경쟁력을 키우는 것이 목적이에요."); - insert into finut.quiz(difficulty, question, answer, description) values ("LO", "PMI ‘ISM 제조업 구매관리자지수’는 생산 관련 지수가 아니고, 경제동향지표입니다.", "TRUE", "PMI 지수는 미국의 공급관리협회에서 매달 조사하는 경기동향지표로, 제조업 실무자에게 업황을 묻는 방식으로 업계 전망을 직접적으로 파악할 수 있어요."); - insert into finut.quiz(difficulty, question, answer, description) values ("MI", "가처분소득은 내가 번 소득에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다.", "TRUE", "가처분소득은 내가 번 소득 중 소비와 저축으로 쓸 수 있는 돈을 뜻해요. 구체적으로는 내가 번 돈에서 세금이나 보험료 등 필수로 나가는 지출을 제외하고, 정부의 혜택 등을 더한 금액입니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("HI", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다.", "TRUE", "감사보고서는 외부 감사인이 회사의 재무제표를 보고, 제대로 작성되었는지 확인하고 의견을 표명하는 보고서입니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("LO", "개인소비지출(PCE)은 개인이 소유한 재산을 사용하여 구입하는 모든 물품과 서비스를 의미합니다.", "TRUE", "개인소비지출(Personal Consumption Expenditures, PCE)은 가계가 재화와 서비스를 구매하는 데 사용하는 지출을 의미합니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("MI", "거래대금은 주식이 사고 팔린 총 금액으로, 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다.", "TRUE", "거래대금은 주식이 사고 팔린 총 금액입니다. 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("HI", "경기순환사이클은 상승과 하락을 반복하는 현상을 의미하며, 크게 회복기-활황기- 후퇴기-침체기가 있다.", "TRUE", "경기가 일정 주기를 두고 상승과 하락을 반복하는 현상을 경기순환이라고 합니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("MI", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동·자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부입니다.", "TRUE", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동· 자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부라고 할 수 있어요."); - insert into finut.quiz(difficulty, question, answer, description) values ("LO", "경착륙은 호황이 끝나고 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다.", "TRUE", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 연착륙과 대비되는 개념입니다."); \ No newline at end of file From 05025e13950cdc9313b5bcc78d1983e3a0d347d9 Mon Sep 17 00:00:00 2001 From: yeojin Date: Mon, 11 Nov 2024 23:28:44 +0900 Subject: [PATCH 48/52] =?UTF-8?q?Update=20Quest:=20quest=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuestController.java | 36 ++++++++++++++---- .../domain/questDone/QuestDone.java | 5 +++ .../domain/questDone/QuestDoneRepository.java | 10 +++++ .../finut_server/service/LevelService.java | 37 +++++++++++++++++++ .../finut_server/service/QuestService.java | 13 +++++++ 5 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/finut/finut_server/domain/questDone/QuestDoneRepository.java create mode 100644 src/main/java/com/finut/finut_server/service/LevelService.java diff --git a/src/main/java/com/finut/finut_server/controller/QuestController.java b/src/main/java/com/finut/finut_server/controller/QuestController.java index 64d05ff..ec86452 100644 --- a/src/main/java/com/finut/finut_server/controller/QuestController.java +++ b/src/main/java/com/finut/finut_server/controller/QuestController.java @@ -4,10 +4,13 @@ import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.quest.Quest; import com.finut.finut_server.domain.quest.QuestDTO; +import com.finut.finut_server.domain.questDone.QuestDone; import com.finut.finut_server.domain.questQuiz.QuestQuiz; import com.finut.finut_server.domain.questQuiz.QuestQuizRepository; import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.user.Users; +import com.finut.finut_server.domain.user.UsersRepository; +import com.finut.finut_server.service.LevelService; import com.finut.finut_server.service.QuestQuizService; import com.finut.finut_server.service.QuestService; import com.finut.finut_server.service.UsersService; @@ -20,10 +23,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; @@ -41,18 +41,21 @@ public class QuestController { @Autowired private QuestService questService; + @Autowired + private LevelService levelService; + @Operation(summary = "전체 퀘스트 가져오기", description = "전체 퀘스트를 가져옵니다") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Quest.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀘스트 내용을 제대로 가지고 오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("") - public ApiResponse> getQuests(HttpServletRequest request, HttpServletResponse response){ + public ApiResponse> getQuests(){ List quests = questService.getAllQuests(); return ApiResponse.onSuccess(quests); } @@ -62,20 +65,37 @@ public ApiResponse> getQuests(HttpServletRequest request, HttpSer @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = QuestQuiz.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀴즈 내용을 제대로 가지고 오지 못했습니다.", + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "퀘스트 퀴즈 내용을 제대로 가지고오지 못했습니다.", content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorReasonDTO.class))) }) @GetMapping("/{questId}") - public ApiResponse> getQuestQuizes(@PathVariable Long questId, HttpServletRequest request, HttpServletResponse response){ + public ApiResponse> getQuestQuizes(@PathVariable Long questId){ List questQuizzes = questQuizService.getQuestQuizzes(questId); return ApiResponse.onSuccess(questQuizzes); } + @Operation(summary = "퀘스트 성공", description = "퀘스트 성공시 Level을 다음 레벨으로 바꿉니다.") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", + schema = @Schema(implementation = QuestDone.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "", + content = @Content), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 에러, 관리자에게 문의 바랍니다.", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ErrorReasonDTO.class))) + }) + @GetMapping("/done-quest/{questId}") + public ApiResponse updateQuestDone(@PathVariable Long questId, HttpServletRequest request, HttpServletResponse response) { + Users user = usersService.getUserIdByToken(request, response); + questService.updateQuestDone(user, questId); + user = levelService.upgradeUserLevel(user.getId()); + return ApiResponse.onSuccess(user); + } } diff --git a/src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java b/src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java index 67ce732..c2ea7ce 100644 --- a/src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java +++ b/src/main/java/com/finut/finut_server/domain/questDone/QuestDone.java @@ -3,11 +3,15 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.IdClass; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor @Entity @IdClass(QuestDoneId.class) public class QuestDone { @@ -16,4 +20,5 @@ public class QuestDone { @Id private Long userId; + } diff --git a/src/main/java/com/finut/finut_server/domain/questDone/QuestDoneRepository.java b/src/main/java/com/finut/finut_server/domain/questDone/QuestDoneRepository.java new file mode 100644 index 0000000..5f4fb6d --- /dev/null +++ b/src/main/java/com/finut/finut_server/domain/questDone/QuestDoneRepository.java @@ -0,0 +1,10 @@ +package com.finut.finut_server.domain.questDone; + +import com.finut.finut_server.domain.quest.Quest; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface QuestDoneRepository extends JpaRepository { + List findAllByUserId(Long userid); +} diff --git a/src/main/java/com/finut/finut_server/service/LevelService.java b/src/main/java/com/finut/finut_server/service/LevelService.java new file mode 100644 index 0000000..cd70c4d --- /dev/null +++ b/src/main/java/com/finut/finut_server/service/LevelService.java @@ -0,0 +1,37 @@ +package com.finut.finut_server.service; + +import com.finut.finut_server.domain.level.Level; +import com.finut.finut_server.domain.level.LevelRepository; +import com.finut.finut_server.domain.user.Users; +import com.finut.finut_server.domain.user.UsersRepository; +import jakarta.transaction.Transactional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class LevelService { + @Autowired + private UsersRepository usersRepository; + + @Autowired + private LevelRepository levelRepository; + @Transactional + public Users upgradeUserLevel(Long userId) { + Users user = usersRepository.findById(userId) + .orElseThrow(() -> new IllegalArgumentException("User not found with id: " + userId)); + + Long currentLevelId = user.getLevel().getId(); + Optional nextLevelOpt = levelRepository.findById(currentLevelId + 1); + + if (nextLevelOpt.isPresent()) { + user.setLevel(nextLevelOpt.get()); + usersRepository.save(user); + return user; + } else { + throw new IllegalStateException("No higher level available. User is already at the highest level."); + } + } + +} diff --git a/src/main/java/com/finut/finut_server/service/QuestService.java b/src/main/java/com/finut/finut_server/service/QuestService.java index 60e6da4..64068c2 100644 --- a/src/main/java/com/finut/finut_server/service/QuestService.java +++ b/src/main/java/com/finut/finut_server/service/QuestService.java @@ -3,6 +3,10 @@ import com.finut.finut_server.domain.quest.Quest; import com.finut.finut_server.domain.quest.QuestDTO; import com.finut.finut_server.domain.quest.QuestRepository; +import com.finut.finut_server.domain.questDone.QuestDone; +import com.finut.finut_server.domain.questDone.QuestDoneId; +import com.finut.finut_server.domain.questDone.QuestDoneRepository; +import com.finut.finut_server.domain.user.Users; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -14,10 +18,19 @@ public class QuestService { @Autowired private QuestRepository questRepository; + @Autowired + private QuestDoneRepository questDoneRepository; + public List getAllQuests() { List quests= questRepository.findAll(); return quests.stream() .map(quest -> new QuestDTO(quest.getId(), quest.getNextLevel())) .collect(Collectors.toList()); } + + public List updateQuestDone(Users users, Long questId) { + QuestDone questDone = new QuestDone(users.getId(), questId); + questDoneRepository.save(questDone); + return questDoneRepository.findAllByUserId(users.getId()); + } } From d6c24308b59beedd053e5912424a27a81260167c Mon Sep 17 00:00:00 2001 From: yeojin Date: Mon, 11 Nov 2024 23:49:50 +0900 Subject: [PATCH 49/52] =?UTF-8?q?Update=20Quiz:=20=ED=80=B4=EC=A6=88=20?= =?UTF-8?q?=EB=A7=9E=EC=B7=84=EC=9D=84=20=EB=95=8C=20xp=20=EA=B0=80=20?= =?UTF-8?q?=EC=98=AC=EB=9D=BC=EA=B0=80=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuizController.java | 17 +-- .../domain/user/UserResponseDTO.java | 16 +++ .../finut/finut_server/domain/user/Users.java | 4 +- .../finut_server/service/UsersService.java | 7 +- .../controller/QuizControllerTest.java | 102 ------------------ 5 files changed, 33 insertions(+), 113 deletions(-) delete mode 100644 src/test/java/com/finut/finut_server/controller/QuizControllerTest.java diff --git a/src/main/java/com/finut/finut_server/controller/QuizController.java b/src/main/java/com/finut/finut_server/controller/QuizController.java index 77d05e6..8f1a04c 100644 --- a/src/main/java/com/finut/finut_server/controller/QuizController.java +++ b/src/main/java/com/finut/finut_server/controller/QuizController.java @@ -4,6 +4,7 @@ import com.finut.finut_server.apiPayload.code.ErrorReasonDTO; import com.finut.finut_server.domain.quiz.Quiz; import com.finut.finut_server.domain.quiz.QuizResponseDTO; +import com.finut.finut_server.domain.user.UserResponseDTO; import com.finut.finut_server.domain.user.Users; import com.finut.finut_server.service.GoogleAuthService; import com.finut.finut_server.service.QuizDoneService; @@ -70,7 +71,7 @@ public ApiResponse> getQuiz(HttpServletRequest request, HttpServl - @Operation(summary = "퀴즈를 맞췄을 때", description = "퀴즈를 맞췄을 때 QuizDone DB에 해당 내용을 저장하고, 난이도 상승에 필요한 퀴즈 개수와 레벨업에 필요한 퀴즈 개수를 증가시킵니다.") + @Operation(summary = "퀴즈를 맞췄을 때", description = "퀴즈를 맞췄을 때 QuizDone DB에 해당 내용을 저장하고, 난이도 상승에 필요한 퀴즈 개수와 레벨업에 필요한 XP를 증가시킵니다.") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = String.class))), @@ -80,25 +81,27 @@ public ApiResponse> getQuiz(HttpServletRequest request, HttpServl content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorReasonDTO.class))) }) - // 퀴즈 맞췄을 때 api/ db 생성(isCorrect = true), diffQuizCnt++, levelQuizCnt++ + // 퀴즈 맞췄을 때 api/ db 생성(isCorrect = true), diffQuizCnt++, xp + 25 @GetMapping("/correct/{quizId}") - public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + public ApiResponse quizCorrect(@PathVariable Long quizId, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { Users user = usersService.getUserIdByToken(request, response); + UserResponseDTO.checkUserXP checkUserXP = null; + if (user == null) { - return ApiResponse.onFailure("401", "User not authenticated", "data"); + return ApiResponse.onFailure("401", "User not authenticated", checkUserXP); } Optional quiz = quizService.getQuizByQuizId(quizId); if (quiz.isPresent()) { quizDoneService.saveQuizDone(user, quiz.get(), true); //db 생성(isCorrect = true) - usersService.updateDiffLevelCnt(user.getId()); //diffQuizCnt++, levelQuizCnt++ + checkUserXP = usersService.updateDiffLevelCnt(user.getId()); //diffQuizCnt++, xp + 25 // 성공 응답 반환 - return ApiResponse.onSuccess("success"); + return ApiResponse.onSuccess(checkUserXP); } else { - return ApiResponse.onFailure("500", "No Quiz", "data"); + return ApiResponse.onFailure("500", "No Quiz", checkUserXP); } } diff --git a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java index b81afc0..6763d21 100644 --- a/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java +++ b/src/main/java/com/finut/finut_server/domain/user/UserResponseDTO.java @@ -1,5 +1,7 @@ package com.finut.finut_server.domain.user; +import com.finut.finut_server.domain.level.Level; +import com.finut.finut_server.domain.level.LevelName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -35,4 +37,18 @@ public static class viewUserInfo { int xp; String levelName; } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class checkUserXP { + Long userId; + String name; + Long money; + int xp; + Level levelName; + } + + } diff --git a/src/main/java/com/finut/finut_server/domain/user/Users.java b/src/main/java/com/finut/finut_server/domain/user/Users.java index 85f5f76..4577661 100644 --- a/src/main/java/com/finut/finut_server/domain/user/Users.java +++ b/src/main/java/com/finut/finut_server/domain/user/Users.java @@ -63,8 +63,8 @@ public class Users extends BaseTimeEntity { @Column(nullable = false) private int diffQuizCount = 0; - @Column(nullable = false) - private int levelQuizCount = 0; +// @Column(nullable = false) +// private int levelQuizCount = 0; @ManyToOne @JoinColumn(name = "difficulty") diff --git a/src/main/java/com/finut/finut_server/service/UsersService.java b/src/main/java/com/finut/finut_server/service/UsersService.java index 65b3f81..cdbcca3 100644 --- a/src/main/java/com/finut/finut_server/service/UsersService.java +++ b/src/main/java/com/finut/finut_server/service/UsersService.java @@ -15,6 +15,7 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @@ -145,13 +146,15 @@ public Users getUserIdByEmail(String email) { .orElseThrow(() -> new RuntimeException("User not found with email: " + email)); } - public void updateDiffLevelCnt(Long userId) { + public UserResponseDTO.checkUserXP updateDiffLevelCnt(Long userId) { Users user = usersRepository.findById(userId) .orElseThrow(() -> new RuntimeException("User not found with id: " + userId)); user.setDiffQuizCount(user.getDiffQuizCount() + 1); // diffQuizCnt 증가 - user.setLevelQuizCount(user.getLevelQuizCount() + 1); // levelQuizCnt 증가 + user.setXP(user.getXP() + 25); // XP 증가 usersRepository.save(user); // 변경사항 저장 + + return new UserResponseDTO.checkUserXP(user.getId(), user.getName(), user.getMoney(), user.getXP(), user.getLevel()); } public Users getUserIdByToken(HttpServletRequest request, HttpServletResponse response) { diff --git a/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java b/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java deleted file mode 100644 index 6b7c146..0000000 --- a/src/test/java/com/finut/finut_server/controller/QuizControllerTest.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.finut.finut_server.controller; - -import com.finut.finut_server.apiPayload.ApiResponse; -import com.finut.finut_server.domain.difficulty.DifficultyType; -import com.finut.finut_server.domain.quiz.AnswerType; -import com.finut.finut_server.domain.quiz.Quiz; -import com.finut.finut_server.domain.user.Users; -import com.finut.finut_server.service.*; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultMatcher; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import java.util.Optional; - -import static org.springframework.test.web.client.match.MockRestRequestMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@ExtendWith(MockitoExtension.class) -@SpringBootTest -public class QuizControllerTest { - - @Mock - private UsersService usersService; - - @Mock - private QuizService quizService; - - @Mock - private QuizDoneService quizDoneService; - - @InjectMocks - private QuizController quizController; - - @Test - public void testQuizCorrectSuccess() throws Exception { - // Arrange - Long quizId = 1L; - Users mockUser = new Users(); // 필요한 필드 초기화 - mockUser.setId(1L); // ID 설정 등 필요한 필드 추가 - Quiz mockQuiz = new Quiz(quizId, DifficultyType.LO, "question", AnswerType.TRUE); // 필요한 필드 초기화 - - HttpServletRequest mockRequest = mock(HttpServletRequest.class); - HttpServletResponse mockResponse = mock(HttpServletResponse.class); - - when(quizService.getQuizByQuizId(quizId)).thenReturn(Optional.of(mockQuiz)); - when(usersService.getUserIdByToken(mockRequest, mockResponse)) - .thenReturn(mockUser); - - // Act - ApiResponse response = quizController.quizCorrect(quizId, mockRequest, mockResponse); - - // Assert - assertEquals("success", response.getMessage()); - assertEquals("200", response.getStatusCode()); - - verify(quizDoneService).saveQuizDone(mockUser, mockQuiz, true); - verify(usersService).updateDiffLevelCnt(mockUser.getId()); - } - - - @Test - public void testQuizCorrectFailure_NoQuiz() throws Exception { - // Arrange - Long quizId = 1L; - Users mockUser = new Users(); - - HttpServletRequest mockRequest = mock(HttpServletRequest.class); - HttpServletResponse mockResponse = mock(HttpServletResponse.class); - - when(usersService.getUserIdByToken(mockRequest, mockResponse)).thenReturn(mockUser); - when(quizService.getQuizByQuizId(quizId)).thenReturn(Optional.empty()); - - // Act - ApiResponse response = quizController.quizCorrect(quizId, mockRequest, mockResponse); - - // Assert - assertEquals("500", response.getStatusCode()); - assertEquals("No Quiz", response.getMessage()); - - verify(quizDoneService, never()).saveQuizDone(any(), any(), anyBoolean()); - verify(usersService, never()).updateDiffLevelCnt(any()); - } - -} From c0683a98e79642367c75b6a25b3200f6c4a45bb0 Mon Sep 17 00:00:00 2001 From: yeojin Date: Mon, 11 Nov 2024 23:56:20 +0900 Subject: [PATCH 50/52] =?UTF-8?q?Update=20Quest:=20=ED=80=98=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=86=B5=EA=B3=BC=ED=96=88=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?xp=20=EB=8B=A4=EC=8B=9C=200=EC=9C=BC=EB=A1=9C=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/finut/finut_server/service/LevelService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/finut/finut_server/service/LevelService.java b/src/main/java/com/finut/finut_server/service/LevelService.java index cd70c4d..f98bbd6 100644 --- a/src/main/java/com/finut/finut_server/service/LevelService.java +++ b/src/main/java/com/finut/finut_server/service/LevelService.java @@ -27,6 +27,7 @@ public Users upgradeUserLevel(Long userId) { if (nextLevelOpt.isPresent()) { user.setLevel(nextLevelOpt.get()); + user.setXP(0); usersRepository.save(user); return user; } else { From 76835f6fc5a4e8e0431188d55957c2f37caf3d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=AC=EC=A7=84=20=7C=20Kim=20Yeojin?= <84865066+LUCETE012@users.noreply.github.com> Date: Tue, 12 Nov 2024 22:13:39 +0900 Subject: [PATCH 51/52] Create main.yml --- .github/workflows/main.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..d908d94 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,26 @@ +name: Deploy to EC2 + +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v3 + + - name: Set up SSH key + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: ${{ secrets.FINUT_SSH_KEY }} + + - name: Deploy to EC2 + env: + EC2_HOST: ${{ secrets.FINUT_EC2_HOST }} + EC2_USER: ${{ secrets.FINUT_EC2_USER }} + run: | + ssh -o StrictHostKeyChecking=no $EC2_USER@$EC2_HOST 'bash /home/ec2-user/app/deploy.sh' From f1d7733ba54307436341ac009dda0bc9418cc6ac Mon Sep 17 00:00:00 2001 From: yeojin Date: Tue, 12 Nov 2024 22:50:48 +0900 Subject: [PATCH 52/52] Update CI --- build.gradle | 14 ++++++++++++++ src/main/resources/difficulty.sql | 10 +++++++--- src/main/resources/level.sql | 18 +++++++++++------- src/main/resources/quest.sql | 16 ++++++++++------ src/main/resources/quest_quiz.sql | 8 +++++++- src/main/resources/quiz.sql | 12 ++++++------ 6 files changed, 55 insertions(+), 23 deletions(-) diff --git a/build.gradle b/build.gradle index e247cf9..8d2d6df 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,15 @@ plugins { id 'io.spring.dependency-management' version '1.1.5' } +jar { + manifest { + attributes( + 'Main-Class': 'com.finut.finut_server.FinutServerApplication' + ) + } +} + + group = 'com.finut' version = '0.0.1-SNAPSHOT' @@ -48,9 +57,14 @@ dependencies { // mysql 설정 runtimeOnly 'com.mysql:mysql-connector-j' + implementation 'org.mariadb.jdbc:mariadb-java-client' //RSS 툴 implementation 'com.rometools:rome:1.15.0' + + //MariaDB + implementation("org.mariadb.jdbc:mariadb-java-client") + } tasks.named('test') { diff --git a/src/main/resources/difficulty.sql b/src/main/resources/difficulty.sql index ecc6888..225e244 100644 --- a/src/main/resources/difficulty.sql +++ b/src/main/resources/difficulty.sql @@ -1,3 +1,7 @@ -INSERT INTO Difficulty (difficulty, diff_quiz_cnt) VALUES ('MI', 3); -INSERT INTO Difficulty (difficulty, diff_quiz_cnt) VALUES ('HI', 3); -INSERT INTO Difficulty (difficulty, diff_quiz_cnt) VALUES ('LO', 3); +use finut; + +INSERT INTO difficulty (difficulty, diff_quiz_cnt) VALUES ('MI', 3); +INSERT INTO difficulty (difficulty, diff_quiz_cnt) VALUES ('HI', 3); +INSERT INTO difficulty (difficulty, diff_quiz_cnt) VALUES ('LO', 3); + +select * from difficulty; \ No newline at end of file diff --git a/src/main/resources/level.sql b/src/main/resources/level.sql index 493798e..151184e 100644 --- a/src/main/resources/level.sql +++ b/src/main/resources/level.sql @@ -4,10 +4,14 @@ LIMIT 0, 5000 -- Date: 2024-11-06 01:59 */ -INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (1, 'PARTTIMEJOB', 400000, 5); -INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (2, 'INTERN', 1000000, 5); -INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (3, 'STAFF', 2000000, 5); -INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (4, 'ASSOCIATEMANAGER', 4000000, 5); -INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (5, 'MANAGER', 6000000, 5); -INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (6, 'SENIORMANAGER', 8000000, 5); -INSERT INTO `level` (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (7, 'DIRECTOR', 10000000, 5); +Use finut; + +INSERT INTO level (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (1, 'PARTTIMEJOB', 400000, 5); +INSERT INTO level (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (2, 'INTERN', 1000000, 5); +INSERT INTO level (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (3, 'STAFF', 2000000, 5); +INSERT INTO level (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (4, 'ASSOCIATEMANAGER', 4000000, 5); +INSERT INTO level (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (5, 'MANAGER', 6000000, 5); +INSERT INTO level (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (6, 'SENIORMANAGER', 8000000, 5); +INSERT INTO level (`id`, `level_name`, `salary`, `level_quiz_cnt`) VALUES (7, 'DIRECTOR', 10000000, 5); + +select * from level; diff --git a/src/main/resources/quest.sql b/src/main/resources/quest.sql index 93ec891..575d5bd 100644 --- a/src/main/resources/quest.sql +++ b/src/main/resources/quest.sql @@ -1,6 +1,10 @@ -INSERT INTO Quest (next_level) VALUES ('INTERN'); -INSERT INTO Quest (next_level) VALUES ('STAFF'); -INSERT INTO Quest (next_level) VALUES ('ASSOCIATEMANAGER'); -INSERT INTO Quest (next_level) VALUES ('MANAGER'); -INSERT INTO Quest (next_level) VALUES ('SENIORMANAGER'); -INSERT INTO Quest (next_level) VALUES ('DIRECTOR'); \ No newline at end of file +use finut; + +INSERT INTO quest (next_level) VALUES ('INTERN'); +INSERT INTO quest (next_level) VALUES ('STAFF'); +INSERT INTO quest (next_level) VALUES ('ASSOCIATEMANAGER'); +INSERT INTO quest (next_level) VALUES ('MANAGER'); +INSERT INTO quest (next_level) VALUES ('SENIORMANAGER'); +INSERT INTO quest (next_level) VALUES ('DIRECTOR'); + +select * from quest; \ No newline at end of file diff --git a/src/main/resources/quest_quiz.sql b/src/main/resources/quest_quiz.sql index ed50073..199411d 100644 --- a/src/main/resources/quest_quiz.sql +++ b/src/main/resources/quest_quiz.sql @@ -1,3 +1,5 @@ +use finut; + INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서를 작성하는 가장 중요한 이유는 무엇인가요?','회사가 요구하는 예의와 규범을 알기 위해','근로 조건과 관련된 불필요한 분쟁을 예방하기 위해','회사 정책에 대한 전반적인 이해를 돕기 위해',2,'근로계약서는 근로기준법에 따라 필수적으로 작성해야 하며, 이는 근로자와 회사 간의 권리와 의무를 명확히 정리해줍니다. 예를 들어, 임금이 제때 지급되지 않는 문제가 발생할 경우, 근로계약서에 명시된 내용에 따라 법적으로 해결할 수 있습니다. 계약서를 통해 근로자는 자신의 권리를 보호받을 수 있으며, 이를 통해 회사와의 불필요한 갈등을 줄일 수 있습니다.'); INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서에 반드시 포함되어야 하는 항목이 아닌 것은 무엇인가요?','임금','근로시간','회사의 비전과 목표',3,'근로계약서에는 근로자가 받아야 할 기본적인 근로 조건이 포함되어야 하며, 대표적인 예로 임금, 근로시간, 휴가, 업무 내용 등이 있습니다. 반면, 회사의 비전과 목표는 근로계약서의 필수 항목이 아니며, 이는 주로 직원들이 회사의 방향성을 이해하도록 설명 자료나 교육 시간에 제공됩니다.'); INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (1,'근로계약서에 임금 지급일이 포함되어야 하는 이유는 무엇인가요','급여 관리에 대한 회사의 계획을 이해하기 위해','근로자가 급여 지급 일정을 명확히 인지하기 위해','임금 산정 방식을 안내하기 위해',2,'근로기준법 제36조에 따르면 임금은 일정한 지급일에 맞춰 지급되어야 합니다. 이를 명시하지 않으면 근로자는 임금이 언제 지급될지 모호해지고, 자칫 임금이 연체되는 경우도 발생할 수 있습니다. 예를 들어, 매월 10일에 급여가 지급되는 회사의 경우, 근로계약서에 이 날짜가 명시되어 있으면 근로자는 매달 임금이 언제 지급될지 확실히 알 수 있습니다. 이는 불필요한 불만과 법적 분쟁을 예방하는 데 도움이 됩니다.'); @@ -27,4 +29,8 @@ INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_o INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'주식 투자 계약서에서 "콜옵션" 조항을 포함하는 경우, 이를 주의 깊게 확인해야 하는 이유는 무엇인가요?','콜옵션이 발동되면 주식을 일정 가격에 매도해야 할 수 있기 때문에','콜옵션은 주식 가격이 떨어질 때 자동으로 발동되기 때문에','콜옵션이 발동되면 배당금 지급 조건이 취소되기 때문에',1,'콜옵션 조항이 있는 경우, 특정 조건 하에서 투자자가 보유한 주식을 사전에 정해진 가격으로 매도해야 할 수 있습니다. 예를 들어, 기업이 투자자에게 주식을 콜옵션을 통해 되사들일 수 있는 권리를 가지면, 주가 상승 시에도 미리 정해진 가격에 매도해야 하는 상황이 발생할 수 있습니다. 이러한 조항을 이해하지 못하면 예상보다 낮은 가격에 주식을 팔아야 하는 상황이 올 수 있습니다.'); INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'펀드 투자 계약서에서 "환매 수수료"를 확인해야 하는 이유는 무엇인가요?','환매 시점에 따라 수수료가 증가하기 때문에','환매 수수료는 투자자 보호 차원에서 무료로 제공되기 때문에','환매 수수료는 투자 시점과 환매 시점의 시장 상황에 따라 달라질 수 있기 때문에',1,'펀드의 환매 수수료는 펀드를 매도하는 시점에 따라 차등적으로 적용되며, 일반적으로 투자 기간이 짧을수록 수수료가 높아지는 경향이 있습니다. 예를 들어, 6개월 내 환매 시 2%의 수수료가 부과되지만, 1년 이상 보유하면 수수료가 없어지는 식으로 설정될 수 있습니다. 이를 잘못 이해하면 단기 투자에서 예상보다 높은 비용을 부담하게 될 수 있습니다.'); INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'주식 투자 계약서에서 "우선 매수권" 조항을 확인해야 하는 이유는 무엇인가요?','우선 매수권 조항이 있으면 투자자가 원하는 시점에 추가 주식을 매수할 수 있기 때문에','기존 주주가 특정 주식 매도 시 우선적으로 해당 주식을 매수할 수 있기 때문에','우선 매수권 조항이 있는 경우, 추가 투자 시 발생하는 세금이 면제되기 때문에',2,'우선 매수권은 기존 주주가 보유한 주식을 제3자에게 매도하기 전에 다른 주주에게 먼저 매수할 기회를 제공하는 권리입니다. 예를 들어, 특정 주식의 대주주가 지분을 처분할 때, 기존 주주는 우선 매수권을 행사하여 지분율을 유지하거나 지분율을 높일 수 있습니다. 이를 이해하지 못하면 우선 매수권을 행사할 기회를 놓치거나 의도치 않게 주식 지분율이 낮아질 수 있습니다.'); -INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'펀드 계약서에 명시된 "헤지 전략"을 파악해야 하는 이유는 무엇인가요?','헤지 전략을 사용하면 펀드의 위험을 줄이기 위해 추가 비용이 발생할 수 있기 때문에','헤지 전략을 사용할 경우 일정 금액 이상의 원금이 보장되기 때문에','헤지 전략은 펀드가 특정 주식에 집중 투자하는 방식을 의미하기 때문에',1,'헤지 전략은 위험을 줄이기 위해 파생상품을 이용하거나 반대 포지션을 취하는 전략으로, 이러한 전략에는 추가 비용이 발생할 수 있습니다. 예를 들어, 해외 주식 펀드가 환율 변동 위험을 줄이기 위해 선물 계약을 사용하면 헤지 비용이 발생하며, 이는 전체 수익에 영향을 미칠 수 있습니다. 헤지 전략을 이해하지 못하면 예상보다 낮은 순이익을 얻게 될 수 있습니다.'); \ No newline at end of file +INSERT INTO quest_quiz (quest_id, question, option1, option2, option3, correct_option, description) VALUES (6,'펀드 계약서에 명시된 "헤지 전략"을 파악해야 하는 이유는 무엇인가요?','헤지 전략을 사용하면 펀드의 위험을 줄이기 위해 추가 비용이 발생할 수 있기 때문에','헤지 전략을 사용할 경우 일정 금액 이상의 원금이 보장되기 때문에','헤지 전략은 펀드가 특정 주식에 집중 투자하는 방식을 의미하기 때문에',1,'헤지 전략은 위험을 줄이기 위해 파생상품을 이용하거나 반대 포지션을 취하는 전략으로, 이러한 전략에는 추가 비용이 발생할 수 있습니다. 예를 들어, 해외 주식 펀드가 환율 변동 위험을 줄이기 위해 선물 계약을 사용하면 헤지 비용이 발생하며, 이는 전체 수익에 영향을 미칠 수 있습니다. 헤지 전략을 이해하지 못하면 예상보다 낮은 순이익을 얻게 될 수 있습니다.'); + + + +select * from quest_quiz; \ No newline at end of file diff --git a/src/main/resources/quiz.sql b/src/main/resources/quiz.sql index 82093c5..bb7b36f 100644 --- a/src/main/resources/quiz.sql +++ b/src/main/resources/quiz.sql @@ -1,17 +1,14 @@ -insert into finut.quiz(difficulty, question, answer,description) values ("MI", "1금융권은 정부에서 만들어진 ‘상호신용금고법’으로부터 나타난 금융회사가 아니라는 것이다.", "TRUE", "은행 외에는 고금리의 사금융밖에 선택지가 없던 1970 년대, 정부에서 ‘상호신용금고법’을 만들어 사금융을 양성화하기 시작했습니다. 이때부터 나타난 회사들은 특정 그룹이나 분야에 전문성을 가진 회사였습니다. 이렇게 새로운 금융회사들이 만들어지던 시기에, 은행과 은행이 아닌 금융회사를 구별해서 부르기 시작했습니다. 예전부터 있었던 은행을 1 금융권으로, ‘은행이 아닌’ 금융회사를 2금융권으로 부르게 된 거죠. 1금융권인 은행과 2금융권에 속해있는 저축은행의 경우, 예금과 대출을 해준다는 측면에서 비슷한 기능을 하기 때문에 소비자 입장에서는 같은 선상에 두고 비교해볼 만합니다.안정성이 높지만 수익률(이자율)이 낮은 1금융권 예금을 택할지, 대출금리가 높지만 대출받기가 더 쉬운 2금융권 대출을 택할지 비교해보는 거예요."); +use finut; +insert into finut.quiz(difficulty, question, answer,description) values ("MI", "1금융권은 정부에서 만들어진 ‘상호신용금고법’으로부터 나타난 금융회사가 아니라는 것이다.", "TRUE", "은행 외에는 고금리의 사금융밖에 선택지가 없던 1970 년대, 정부에서 ‘상호신용금고법’을 만들어 사금융을 양성화하기 시작했습니다. 이때부터 나타난 회사들은 특정 그룹이나 분야에 전문성을 가진 회사였습니다. 이렇게 새로운 금융회사들이 만들어지던 시기에, 은행과 은행이 아닌 금융회사를 구별해서 부르기 시작했습니다. 예전부터 있었던 은행을 1 금융권으로, ‘은행이 아닌’ 금융회사를 2금융권으로 부르게 된 거죠. 1금융권인 은행과 2금융권에 속해있는 저축은행의 경우, 예금과 대출을 해준다는 측면에서 비슷한 기능을 하기 때문에 소비자 입장에서는 같은 선상에 두고 비교해볼 만합니다.안정성이 높지만 수익률(이자율)이 낮은 1금융권 예금을 택할지, 대출금리가 높지만 대출받기가 더 쉬운 2금융권 대출을 택할지 비교해보는 거예요."); insert into finut.quiz(difficulty, question, answer, description) values ("HI", "추가경정예산안은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하는 것이다.", "TRUE", "추경은 ‘추가경정예산’의 줄임말이고, 경정(更正)은 ‘바르게 고친다’라는 뜻이에요. 추가경정예산은 이미 1년 예산을 정해두었는데, 예산을 세운 뒤에 생긴 일 때문에 금액을 더 보태서 고친다는 걸 뜻하죠. 연초에 세운 계획보다 돈을 더 쓰겠다는 건데요. 추경안은 자연재해나 큰 사고가 나서 인프라와 사회를 복구해야 할 때 나옵니다. 그래서 지난 추경안 규모를 보면 굵직한 경제적 충격들을 읽을 수 있어요. 추경 규모가 10조 원을 넘는 곳(빨간색 그래프)은 리먼브라더스 사태가 촉발한 세계 금융위기, 브렉시트 등 우리나라뿐만 아니라 세계적인 경제 위기가 있었던 시기입니다. 그중에서도 2020년과 2021년의 추경 횟수와 금액은 ‘역대급’이니, 코로나19가 세계적으로 얼마나 커다란 경제적 충격을 가져왔는지 알 수 있어요. 사실 추경 자체가 엄청나게 특별한 일은 아닙니다. 우리나라뿐만 아니라 전 세계 국가 대부분이 매년 추경을 실시합니다. 돈 쓸 일이 너무 많다 보니 1년 동안 얼마가 필요할지 정확하게 예측하기가 어렵거든요. 돌발사태가 발생하기도 하고요. 국가가 사업을 집행하는 데는 국민의 세금이 사용됩니다. 그래서 국민의 대리인인 국회의원과 정당이 추가예산이 필요하다는 행정부를 상대로 견제하기 시작합니다. ‘추경을 하느냐, 마느냐’보다는 추경 횟수와 액수 등을 두고 다투죠. 일명 ‘감액심사’라고 해요. 정치적 이해관계에 따라 여당이 행정부 편을 많이 들어주기도 하는데요. 보통 매년 추경을 하기 때문에 ‘필요하다’라는 쪽으로 결론이 나긴 합니다. 하지만 모든 추경안이 실행되는 건 아니에요. 예를 들어 어떤 정당이 추경을 해야 할 만큼 꼭 필요한 사업이라고 생각하지 않고, 이들의 주장이 국회 다수결로 지지를 받는다면 추경안은 실행되지 않습니다."); insert into finut.quiz(difficulty, question, answer, description) values ("HI", "2차전지는 충전과 방전을 통해 사용이 가능한 전지가 아니에요.", "FALSE", "2차전지는 충전과 방전을 통해 여러 번 사용이 가능한 전지예요. 대표적인 2 차전지로는 휴대폰 배터리가 있습니다. 종류는 납 축전지, 니켈카드뮴 전지, 니켈수소 전지, 리튬이온 전지 등이 있어요."); - insert into finut.quiz(difficulty, question, answer, description) values ("MI", "52주 신고가는 특정 주식이 지난 1년 동안 기록한 가장 높은 주가입니다.", "TRUE", "52주 신고가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 높은 주가를 말해요."); - insert into finut.quiz(difficulty, question, answer, description) values ("LO", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말합니다.", "TRUE", "52주 신저가는 특정 주식이 지난 52주(1년) 동안 기록한 가장 낮은 주가를 말해요."); - insert into finut.quiz(difficulty, question, answer, description) values ("HI", "bp(베이시스포인트)는 0.01%p의 움직임도 금융시장에 큰 영향을 미칩니다.", "TRUE", "기준금리 뉴스에 자주 등장하는 ‘bp’는 ‘basis point’의 약자예요. 금융에서 쓰이는 기본단위로, 금리나 수익률, 환율을 나타낼 때 사용합니다. 일반적으로 사용하는 백분율이 아닌 ‘만분율’ 단위의 움직임을 표현하는데요. 1bp는 0.01%p, 10bp는 0.1%p, 100bp는 1%p예요. 금융시장에서는 0.01%p의 움직임도 영향력이 커요. 그래서 0.01%p도 뉴스에 자주 언급됩니다. 백분율을 기준으로 ‘퍼센트포인트’라고 말하는 것보다 만분율을 기준으로 bp로 나타내는 것이 정보전달에 더 효율적이라서 사용한다는 얘기가 있어요."); insert into finut.quiz(difficulty, question, answer, description) values ("MI", "DSR은 내 소득 대비 금융부채 원리금 상환비율로, 40%를 넘는 경우에는 대출을 해주지 않는다.", "TRUE", "DSR(Debt Service Ratio)은 내 소득 대비 금융부채 원리금 상환비율이에요. DSR 40%라면 내 연 소득이 1억 원일 때, 1년 동안의 원금과 이자 상환비율이 4천만 원을 넘지 않는 정도까지 대출을 해준다는 뜻이에요."); insert into finut.quiz(difficulty, question, answer, description) values ("LO", "DTI(총부채상환비율)는 연 소득 대비 금융비용 부담률을 나타내는 지표입니다.", "TRUE", "DTI(Debt to Income : 총부채상환비율)는 연 소득 대비 금융비용 부담률을 의미합니다. 소득과 비교한 대출금 수준을 판단하는 지표예요. DTI는 ‘나의 연소 득’에서 ‘주택담보대출의 원금 상환과 이자, 다른 대출의 이자로 나가는 금액’이 차지하는 비중으로 구합니다. 내가 가진 모든 대출의 원리금 상환금액을 합쳐 따지는 DSR보다는 유한 기준입니다."); insert into finut.quiz(difficulty, question, answer, description) values ("HI", "ESG는 환경, 사회, CORPORATE GOVERNANCE에 대한 고려를 의미합니다.", "TRUE", "ESG는 Environmental(환경), Social(사회), Governance(지배구조)의 첫 글자를 조합한 단어로 기업의 친환경 경영, 사회적 책임, 투명한 지배구조 등을 의미합니다."); - insert into finut.quiz(difficulty, question, answer, description) values ("MI", "ETF는 특정 주식에 대한 투자 상품이 아니다.", "TRUE", "ETF(Exchange Traded Fund)는 말 그대로 인덱스펀드를 거래소에 상장시켜 투자자들이 주식처럼 편리하게 거래할 수 있도록 만든 상품입니다."); insert into finut.quiz(difficulty, question, answer, description) values ("LO", "G7은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최하는 7개국을 의미합니다.", "TRUE", "G7. Group of Seven Summit. 주요 7개국 정상회담의 약자입니다. 미국, 캐나다, 영국, 독일, 프랑스, 이탈리아, 일본 7개국은 매년 정기적으로 국제 사회 현안에 대한 회의를 개최해요. 이 회담뿐만 아니라 이 회담에 참여하는 7개국을 G7이라고 줄여 부르기도 해요."); insert into finut.quiz(difficulty, question, answer, description) values ("HI", "GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 것이다.", "TRUE", "GNI는 Gross National Income의 약자로, ‘국민총소득’입니다. GNI는 일정 기간 내 ‘우리나라 국적을 가진 사람’이 벌어들인 모든 소득을 더한 거예요. 우리나라에 거주하고 있는 외국인의 소득은 제외하고, 외국에 거주하는 우리나라 국민의 소득을 포함해요. GNI를 구하는 가장 큰 이유는 국가가 아니라 국민들의 생활 수준을 알아보기 위해서예요. GNI와 유사한 지표로는 GDP가 있어요."); @@ -25,4 +22,7 @@ insert into finut.quiz(difficulty, question, answer, description) values ("LO", insert into finut.quiz(difficulty, question, answer, description) values ("MI", "거래대금은 주식이 사고 팔린 총 금액으로, 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다.", "TRUE", "거래대금은 주식이 사고 팔린 총 금액입니다. 매매된 주식의 수량을 나타내는 거래량과 함께 보는 지표입니다."); insert into finut.quiz(difficulty, question, answer, description) values ("HI", "경기순환사이클은 상승과 하락을 반복하는 현상을 의미하며, 크게 회복기-활황기- 후퇴기-침체기가 있다.", "TRUE", "경기가 일정 주기를 두고 상승과 하락을 반복하는 현상을 경기순환이라고 합니다."); insert into finut.quiz(difficulty, question, answer, description) values ("MI", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동·자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부입니다.", "TRUE", "경상수지는 일정 기간 우리나라와 외국 사이 상품·서비스의 수출입과 노동· 자본에 지급된 대가처럼 경제에서 ‘생산을 담당하는 요소’의 흐름을 금액으로 계산한 장부라고 할 수 있어요."); -insert into finut.quiz(difficulty, question, answer, description) values ("LO", "경착륙은 호황이 끝나고 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다.", "TRUE", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 연착륙과 대비되는 개념입니다."); \ No newline at end of file +insert into finut.quiz(difficulty, question, answer, description) values ("LO", "경착륙은 호황이 끝나고 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다.", "TRUE", "경착륙은 활발하게 잘 나가던 경기가 얼어붙으면서 자산 가치가 폭락하고 실업자가 급증하는 사태를 말합니다. 연착륙과 대비되는 개념입니다."); + + +select * from quiz; \ No newline at end of file