Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
50 changes: 21 additions & 29 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,46 +1,38 @@
plugins {
id 'org.springframework.boot' version '2.7.17' // 스프링 부트 플러그인 적용
id 'io.spring.dependency-management' version '1.0.15.RELEASE' // 의존성 관리 플러그인
id 'java'
id 'idea'
}

idea {
module {
inheritOutputDirs = false
outputDir = file('./webapp/WEB-INF/classes')
}
}

group 'org.example'
version '1.0-SNAPSHOT'
group = 'org.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11' // 사용하는 자바 버전에 맞게 설정 (예: 11)

repositories {
mavenCentral()
}

ext {
springVersion = "5.1.8.RELEASE"
tomcatVersion = '8.5.42'
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testImplementation "org.springframework:spring-test:$springVersion"
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
// 1. Spring Boot Web Starter
implementation 'org.springframework.boot:spring-boot-starter-web'

// 2. Spring Boot Data JPA Starter
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

implementation("org.springframework:spring-jdbc:$springVersion")
implementation("org.springframework:spring-web:$springVersion")
implementation "org.reflections:reflections:0.10.2"
// 3. JSP 템플릿 엔진 사용을 위한 의존성
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'javax.servlet:jstl:1.2'

implementation("org.apache.commons:commons-dbcp2:2.6.0")
// 4. 데이터베이스 드라이버 (H2, MySQL 등 필요한 것 사용)
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'

runtimeOnly("com.h2database:h2:2.1.214")
runtimeOnly('mysql:mysql-connector-java:8.0.28')
// 5. Lombok (선택 사항이지만 강력히 추천)
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

implementation("org.apache.tomcat.embed:tomcat-embed-core:$tomcatVersion")
implementation("org.apache.tomcat.embed:tomcat-embed-logging-juli:8.5.2")
implementation("org.apache.tomcat.embed:tomcat-embed-jasper:$tomcatVersion")
implementation group: 'javax.servlet', name: 'jstl', version: '1.2'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.7.1'
// 6. Spring Boot Test Starter
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
Expand Down
868 changes: 824 additions & 44 deletions java-webMVC.ipr

Large diffs are not rendered by default.

440 changes: 278 additions & 162 deletions java-webMVC.iws

Large diffs are not rendered by default.

22 changes: 0 additions & 22 deletions src/main/java/WebServerLauncher.java

This file was deleted.

34 changes: 0 additions & 34 deletions src/main/java/core/jdbc/ConnectionManager.java

This file was deleted.

12 changes: 12 additions & 0 deletions src/main/java/jwp/WebServerLauncher.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package jwp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebServerLauncher {

public static void main(String[] args) throws Exception {
SpringApplication.run(WebServerLauncher.class, args);
}
}
30 changes: 23 additions & 7 deletions src/main/java/jwp/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,34 @@
package jwp.controller;

import jwp.dao.QuestionDao;
import jwp.model.Question;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

@Controller
@RequiredArgsConstructor
public class HomeController {

private final QuestionDao questionDao;
@GetMapping("/")
public String listQuestions(Model model) throws ServletException, IOException {
model.addAttribute("questions", questionDao.findAll());

return "/home";
}


@WebServlet("/")
public class HomeController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher rd = req.getRequestDispatcher("/home.jsp");
rd.forward(req, resp);
}
}
42 changes: 42 additions & 0 deletions src/main/java/jwp/controller/QnaController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package jwp.controller;

import jwp.dao.QuestionDao;
import jwp.model.Question;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import util.SessionUtil;
import util.UserSessionUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@Controller
@RequestMapping("/qna")
@RequiredArgsConstructor
public class QnaController {
private final QuestionDao questionDao;

@PostMapping("/create")
public String createQuestion(@ModelAttribute Question question) throws ServletException, IOException {
questionDao.insert(question);
return "redirect:/";
}
@GetMapping("/form")
public String form(HttpSession session) {
if (UserSessionUtils.isLogined(session)) {
return "/qna/form";
}
return "redirect:/user/login";
}
@GetMapping("/show")
public String show(@RequestParam("questionId") String questionId, Model model) throws ServletException, IOException {
Question question = questionDao.findByQuestionId((Long.parseLong(questionId)));
model.addAttribute("question", question);
return "qna/show";
}
}
78 changes: 78 additions & 0 deletions src/main/java/jwp/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package jwp.controller;

import core.db.MemoryUserRepository;
import jwp.dao.UserDao;
import jwp.model.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import util.SessionUtil;
import util.UserSessionUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Collection;

@Controller()
@RequestMapping("/user")
@RequiredArgsConstructor

public class UserController {
private final UserDao userDao;

@PostMapping("/signup")
public String createUser(@ModelAttribute User user) throws Exception {
userDao.insert(user);
System.out.println("user 회원가입 완료");
return "redirect:/user/list";
}

@GetMapping("/list")
public String listUsers(HttpSession session, Model model) throws Exception {

if(UserSessionUtils.isLogined(session)) {
model.addAttribute("users", userDao.findAll());
return "/user/list";
}
return "redirect:/user/login";
}

@PostMapping("/login")
public String userLogin(@RequestParam("userId") String userId, @RequestParam("password") String password, HttpSession session) throws Exception {
User user = userDao.findByUserId(userId);
if(user != null && user.getPassword().equals(password)){
session.setAttribute("user", user);
return "redirect:/";
}
return "redirect:/user/loginFailed";
}

@GetMapping("/logout")
public String userLogout(HttpSession session) throws ServletException, IOException {
session.removeAttribute("user");
return "redirect:/";
}

@PostMapping("/update")
public String update(@ModelAttribute User user) throws Exception {
userDao.update(user);
return "redirect:/user/list";
}

@GetMapping("/updateForm")
public String updateForm(@RequestParam("userId") String userId , HttpSession session) throws ServletException, IOException {
User user = (User)session.getAttribute("user");
if (!UserSessionUtils.isLogined(session)) {
return "redirect:/user/login";
}
if(user!=null && user.getUserId().equals(userId)){
return "/user/updateForm";
}
return "redirect:/";
}
}
31 changes: 31 additions & 0 deletions src/main/java/jwp/dao/QuestionDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package jwp.dao;

import jwp.model.Question;
import jwp.model.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import util.Keyholder;

import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import java.sql.SQLException;
import java.util.List;

@Repository
@RequiredArgsConstructor
public class QuestionDao {
private final EntityManager em;

public List<Question> findAll() {
return em.createQuery("select q from Question q", Question.class).getResultList();
}

@Transactional
public void insert(Question question) {
em.persist(question);
}

public Question findByQuestionId(Long questionId) {
return em.find(Question.class, questionId);
}
}
36 changes: 36 additions & 0 deletions src/main/java/jwp/dao/UserDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package jwp.dao;

import jwp.model.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import java.sql.SQLException;
import java.util.List;


@Repository
@RequiredArgsConstructor
public class UserDao {

private final EntityManager em;

@Transactional
public void insert(User user) throws SQLException {
em.persist(user);
}

public void update(User user) throws SQLException {
em.merge(user);
}


public List<User> findAll() throws SQLException {
return em.createQuery("select u from User u", User.class).getResultList();
}

public User findByUserId(String userId) throws SQLException {
return em.find(User.class, userId);
}
}
Loading