Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
0c9cf27
feat Repository 인터페이스 및 구현체 생성
whxogus215 Aug 27, 2023
79d18c5
docs DB 비밀번호 환경변수로 저장
whxogus215 Aug 28, 2023
48cf3ad
feat JDBC,MySQL 라이브러리 추가
whxogus215 Aug 28, 2023
8de131c
docs 외부 환경변수 파일 include
whxogus215 Aug 28, 2023
eceee54
feat totalCountRead() 구현
whxogus215 Aug 28, 2023
8faccf1
fix 클래스 이름 변경 - 소문자에서 대문자로 변경
whxogus215 Aug 28, 2023
d6e6c1a
chore build.gradle 테스트 라이브러리 추가
whxogus215 Aug 28, 2023
0d4008b
test totalCountRead 테스트 완료
whxogus215 Aug 28, 2023
c767721
feat DataSourceUtils로 변경
whxogus215 Sep 2, 2023
1ab0940
feat totalCountUpdate() 구현 및 테스트 완료
whxogus215 Sep 2, 2023
a45e841
초본
gmltn9233 Sep 2, 2023
1f10446
append questionList
gmltn9233 Sep 2, 2023
b71dd20
append status,section
gmltn9233 Sep 2, 2023
fffd541
chore 테이블 컬럼명 변경 totalCount -> total_count
whxogus215 Sep 5, 2023
109944b
docs 메서드 주석 추가
whxogus215 Sep 6, 2023
3ab15b8
append result
gmltn9233 Sep 7, 2023
abd1f86
append commentary
gmltn9233 Sep 7, 2023
047f5f3
append rankingpage
gmltn9233 Sep 7, 2023
0c8e664
Merge pull request #4 from Sejong-Java-Study/taehyeon
whxogus215 Sep 8, 2023
600d97b
Merge remote-tracking branch 'origin/develop' into taehyeon
whxogus215 Sep 8, 2023
ea8ecd2
feat questionWrongCountRead 메서드 구현
whxogus215 Sep 11, 2023
2d3e862
test questionWrongCountRead 테스트 완료
whxogus215 Sep 11, 2023
2c88e22
append shareicon
gmltn9233 Sep 11, 2023
fab94d8
feat questionWrongCountUpdate 구현
whxogus215 Sep 12, 2023
8d377e5
test questionWrongCountUpdate 테스트
whxogus215 Sep 12, 2023
4bba829
Merge pull request #6 from Sejong-Java-Study/heesu
gmltn9233 Sep 15, 2023
9c32d51
Merge pull request #7 from Sejong-Java-Study/taehyeon
whxogus215 Sep 15, 2023
ab4d40c
feat service,controller,dto
yuhandemian Sep 15, 2023
3496808
Merge pull request #8 from Sejong-Java-Study/yuhan
Sep 15, 2023
546620a
refactor 코드 전체 수정
whxogus215 Sep 15, 2023
98a3091
Merge pull request #9 from Sejong-Java-Study/taehyeon
whxogus215 Sep 15, 2023
22ba126
feat 2차 수정
yuhandemian Sep 15, 2023
21cbccf
Merge branch 'develop' into yuhan
Sep 15, 2023
0740b18
Merge pull request #10 from Sejong-Java-Study/yuhan
Sep 15, 2023
6badcb6
refactor 컨트롤러,DTO,서비스 수정
whxogus215 Sep 15, 2023
b79da98
Merge pull request #11 from Sejong-Java-Study/taehyeon
whxogus215 Sep 15, 2023
6f5a9a5
second edit
yuhandemian Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,8 @@ out/

### VS Code ###
.vscode/

### DB 비밀번호 ###
/src/main/resources/db.properties
/src/test/java/com/web/mzvoca/repository/DBConst.java
/src/main/resources/application-db.properties
9 changes: 9 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,17 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'

// 테스트코드 @Slf4j 사용
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'

annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

// JDBC, MySQL
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.mysql:mysql-connector-j'
}

tasks.named('test') {
Expand Down
3 changes: 2 additions & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
rootProject.name = 'mzvoca'
rootProject.name = 'mzvoca' +
''
22 changes: 22 additions & 0 deletions src/main/java/com/web/mzvoca/controller/QuizController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.web.mzvoca.controller;

import com.web.mzvoca.dto.AnswerDTO;
import com.web.mzvoca.dto.RequestDto;
import com.web.mzvoca.service.QuizService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class QuizController {

private final QuizService quizService;

@PostMapping("/wrongRate")
public List<AnswerDTO> getWrongRate(@RequestBody List<RequestDto> requestDtos) {
return quizService.getWrongCountRate(requestDtos);
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/web/mzvoca/dto/AnswerDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.web.mzvoca.dto;

import lombok.Data;

@Data
public class AnswerDTO {

private final int questionNumber; //문제 번호를 나타내는 정수형 변수
private final double wrongCountRate; //오답률은 0과 1 사이의 값으로, 1에 가까울수록 오답률이 높다는 것을 의미합니다.

}

//AnswerDTO는 주로 문제 번호와 해당 문제의 오답률을 전송하는 데 사용
19 changes: 19 additions & 0 deletions src/main/java/com/web/mzvoca/dto/QuizDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.web.mzvoca.dto;

import lombok.Data;

@Data
public class QuizDTO {
private Long questionNumber; //문제 번호를 나타내는 Long 타입의 변수
private String q; // 문제 내용을 나타내는 문자열
private AnswerOption[] a; // 답안 옵션을 나타내는 AnswerOption 배열입니다.
private String c; // : 문제에 대한 해설을 나타내는 문자열입니다.

@Data
public static class AnswerOption {
private String answer; //답안의 내용을 나타내는 문자열입니다.
private int[] type; // 답안의 유형을 나타내는 정수 배열
}
}

//QuizDTO는 주로 퀴즈 문제의 내용, 답안 옵션, 해설 등의 정보를 전송하는 데 사용
12 changes: 12 additions & 0 deletions src/main/java/com/web/mzvoca/dto/RequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.web.mzvoca.dto;

import lombok.Data;

@Data
public class RequestDto {
private int questionNumber; //문제 번호를 나타내는 정수 필드
private int selectedAnswer; //선택된 답변의 번호나 값을 나타내는 정수 필드
private boolean tf; // 참/거짓 값을 나타내는 불린 필드
private int section; //섹션 번호나 구분을 나타내는 정수 필드
}
//RequestDto는 클라이언트에서 서버로 보내는 요청 데이터의 구조를 정의
7 changes: 7 additions & 0 deletions src/main/java/com/web/mzvoca/repository/ConnectionConst.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.web.mzvoca.repository;

public abstract class ConnectionConst {
public static final String URL = "";
public static final String userName = "root";
public static final String password = "";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.web.mzvoca.repository;

public interface QuestionRepository {

public int questionWrongCountRead(int questionNumber);

public void questionWrongCountUpdate(int questionNumber);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.web.mzvoca.repository;

import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import javax.xml.transform.Result;
import java.sql.*;
import java.util.NoSuchElementException;

@RequiredArgsConstructor
@Repository
public class QuestionRepositoryImpl implements QuestionRepository {

private final DataSource dataSource;

/**
* @return 특정 문항의 "wrong_count"를 반환
*/
@Override
public int questionWrongCountRead(int questionNumber) {
// wrong_count 컬럼 조회 - where PK 값으로";
String sql = "select wrong_count from question where question_number = ?";

Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
// Datasource로부터 커넥션을 가져온 뒤, 쿼리문을 실행하여 ResultSet에 반환
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, questionNumber);
rs = pstmt.executeQuery();

if (rs.next()) {
return rs.getInt("wrong_count");
} else {
throw new NoSuchElementException("wrong_count 값이 없습니다.");
}

} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
close(con, pstmt, rs);
}
}

/**
* 특정 문제의 오답 횟수를 1 증가
*/
@Override
public void questionWrongCountUpdate(int questionNumber) {
// wrongCount UPDATE where PK = questionNumber
String sql = "update question set wrong_count = wrong_count + 1 where question_number = ?";

Connection con = null;
PreparedStatement pstmt = null;

try {
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, questionNumber);
pstmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
close(con, pstmt, null);
}
}

private Connection getConnection() throws SQLException {
// 트랜잭션 동기화를 위해 DataSourceUtils 메서드 사용
Connection con = DataSourceUtils.getConnection(dataSource);
return con;
}

private void close(Connection con, Statement stmt, ResultSet rs) {
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(stmt);
// 트랜잭션 동기화를 위해 DataSourceUtils 메서드 사용
DataSourceUtils.releaseConnection(con, dataSource);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.web.mzvoca.repository;

public interface TotalCountRepository {

public int totalCountRead();

public void totalCountUpdate();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.web.mzvoca.repository;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.*;
import java.util.NoSuchElementException;

@Repository
@RequiredArgsConstructor
@Slf4j
public class TotalCountRepositoryImpl implements TotalCountRepository {

private final DataSource dataSource;

/**
* @return 현재 제출된 횟수를 반환
*/
@Override
public int totalCountRead() {
String sql = "select * from totalcount";

Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
con = getConnection();
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
// 가져온 데이터가 있을 때 실행할 부분
int totalCount = rs.getInt("total_count");
return totalCount;
} else {
throw new NoSuchElementException("값이 없습니다.");
}

} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
close(con, pstmt, rs);
}
}

/**
* 현재 제출 횟수에서 +1하는 메서드
*/
@Override
public void totalCountUpdate() {
// Update문을 통해 totalCount 값을 1 증가
String sql = "update totalcount set total_count = total_count + 1";

Connection con = null;
PreparedStatement pstmt = null;

try {
con = getConnection();
pstmt = con.prepareStatement(sql);
int result = pstmt.executeUpdate();
log.info("실행된 행 개수={}", result);
} catch (SQLException e) {
log.info("db Error", e);
throw new RuntimeException(e);
} finally {
close(con, pstmt, null);
}
}

private Connection getConnection() throws SQLException {
// 트랜잭션 동기화를 위해 DataSourceUtils 메서드 사용
Connection con = DataSourceUtils.getConnection(dataSource);
return con;
}

private void close(Connection con, Statement stmt, ResultSet rs) {
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(stmt);
// 트랜잭션 동기화를 위해 DataSourceUtils 메서드 사용
DataSourceUtils.releaseConnection(con, dataSource);
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/web/mzvoca/service/QuizService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.web.mzvoca.service;

import com.web.mzvoca.dto.AnswerDTO;
import com.web.mzvoca.dto.RequestDto;
import java.util.List;

public interface QuizService {
List<AnswerDTO> getWrongCountRate(List<RequestDto> requestDtos);
}
//매개변수: List<RequestDto> requestDtos - 사용자의 답변과 관련된 정보를 포함하는 RequestDto 객체의 목록
//반환 타입: List<AnswerDTO> - 각 문제에 대한 잘못된 답변 비율을 포함하는 AnswerDTO 객체의 목록
37 changes: 37 additions & 0 deletions src/main/java/com/web/mzvoca/service/QuizServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.web.mzvoca.service;

import com.web.mzvoca.dto.AnswerDTO;
import com.web.mzvoca.dto.RequestDto;
import com.web.mzvoca.repository.QuestionRepository;
import com.web.mzvoca.repository.TotalCountRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class QuizServiceImpl implements QuizService {

private final TotalCountRepository totalCountRepository;
private final QuestionRepository questionRepository;

@Override
public List<AnswerDTO> getWrongCountRate(List<RequestDto> requestDtos) {
int totalCount = totalCountRepository.totalCountRead();//전체 제출 횟수를 조회합니다.
List<AnswerDTO> answerDTOList = new ArrayList<>();
//사용자의 답변을 기반으로 각 문제의 잘못된 답변 비율을 계산
for (RequestDto requestDto : requestDtos) {
int questionNumber = requestDto.getQuestionNumber();
int wrongCount = questionRepository.questionWrongCountRead(questionNumber);
//사용자의 답변 목록을 순회하면서 각 문제의 잘못된 답변 횟수를 조회합니다.
double wrongRate = (double) wrongCount / totalCount;
answerDTOList.add(new AnswerDTO(questionNumber, wrongRate));
}
//잘못된 답변 비율을 계산하고, 이를 AnswerDTO 객체에 저장합니다.
//계산된 AnswerDTO 객체를 목록에 추가합니다.

return answerDTOList;
//반환 값: 각 문제에 대한 잘못된 답변 비율을 포함하는 AnswerDTO 객체의 목록
}
}
3 changes: 2 additions & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@

# DB ?? ??
spring.profiles.include = db
Loading