루트 프로젝트를 바꿔라
프로젝트 경로를 바꿔라
버전, 그룹을 바꿔라 -> build gradle 코끼리 모양 아이콘 ->
settings.gradle 이름 수정 -> tomcat gradle 이름이 수정된다
application context의미 - 서버에 배포할 이름 설정
application server -> tomcat 10.1.48
jdk version -> temurine 17
default constructor는 constructor가 하나도 존재하지 않을 때만 생성된다.
<!--JDBCController GPT수정본-->
package com.example.demo.controller;
import com.example.demo.domain.Actor;
import com.example.demo.domain.City;
import com.example.demo.domain.Country;
import com.example.demo.domain.CountryLanguage;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
@WebServlet(name="jdbcController",
urlPatterns = {"/sba2/country","/sba2/city", "/sba2/language",
"/sba2/actor", "/sba2/save", "/sba2/delete", "/sba2/update-form", "/sba2/update"})
public class JDBCController extends HttpServlet {
private Connection conn = null;
private Statement stmt = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
protected void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String dbServer = "jdbc:mysql://localhost:3306/";
String jdbcUrl = dbServer + "world";
String dbUser = "root";
String dbPass = "cometrue";
// URI에서는 마지막 '/' 뒷 부분을 서브스트링화
String uri = request.getRequestURI();
String tbName = uri.substring(uri.lastIndexOf('/') + 1);
String query = "";
if(tbName.equals("city")){
query = "select * from city";
}
else if(tbName.equals("country")){
query = "select * from country";
}
else if(tbName.equals("language")){
query = "select * from countrylanguage"; // ★ 오타 수정(countrylauage → countrylanguage)
}
else if(tbName.equals("actor")){
jdbcUrl = dbServer + "sakila"; // 다른 DB를 사용 지정함
query = "select * from actor order by last_update desc"; // sakila DB에 포함된 actor 테이블에 질의
}
else if(tbName.equals("save")){
jdbcUrl = dbServer + "sakila"; // 다른 DB를 사용 지정함
query = "insert into actor(first_name, last_name) values ('" + // ★ 문자열 오류 수정
request.getParameter("first_name") + "', '" +
request.getParameter("last_name") + "')"; // ★ last_name 제대로 반영
}
else if(tbName.equals("delete")){
jdbcUrl = dbServer + "sakila";
query = "delete from actor where actor_id = " + Integer.parseInt(request.getParameter("actor-id"));
}
else if(tbName.equals("update")){
jdbcUrl = dbServer + "sakila";
query = "update actor set first_name = '" + request.getParameter("first_name") +
"', last_name = '" + request.getParameter("last_name") +
"' where actor_id = " + Integer.parseInt(request.getParameter("actor_id"));
}
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass);
stmt = conn.createStatement();
if(tbName.equals("country")) {
rs = stmt.executeQuery(query);
ArrayList<Country> countries = new ArrayList<Country>();
Country country = null;
while (rs.next()) {
country = new Country();
country.setCode(rs.getString(1));
country.setName(rs.getString(2));
country.setContinent(rs.getString(3));
country.setRegion(rs.getString(4));
countries.add(country);
}
request.setAttribute("list", countries);
request.getRequestDispatcher("/WEB-INF/sba2/country.jsp").forward(request, response);
}
else if(tbName.equals("city")) {
rs = stmt.executeQuery(query);
ArrayList<City> cities = new ArrayList<City>();
City city = null;
while (rs.next()) {
city = new City();
city.setId(rs.getInt(1));
city.setName(rs.getString(2));
city.setCountryCode(rs.getString(3));
city.setDistrict(rs.getString(4));
city.setPopulation(rs.getInt(5));
cities.add(city);
}
request.setAttribute("list", cities);
request.getRequestDispatcher("/WEB-INF/sba2/city.jsp").forward(request, response);
}
else if(tbName.equals("language")) {
rs = stmt.executeQuery(query);
ArrayList<CountryLanguage> countryLanguages = new ArrayList<CountryLanguage>();
CountryLanguage countryLanguage = null;
while (rs.next()) {
countryLanguage = new CountryLanguage();
countryLanguage.setCountryCode(rs.getString(1));
countryLanguage.setLanguage(rs.getString(2));
countryLanguage.setIsOfficial(rs.getString(3));
countryLanguage.setPopulation(rs.getString(4));
countryLanguages.add(countryLanguage);
}
request.setAttribute("list", countryLanguages);
request.getRequestDispatcher("/WEB-INF/sba2/country-language.jsp").forward(request, response);
}
else if(tbName.equals("actor")) {
rs = stmt.executeQuery(query);
ArrayList<Actor> actors = new ArrayList<Actor>();
Actor actor = null;
while (rs.next()) {
actor = new Actor();
actor.setActorId(rs.getInt(1));
actor.setFirstName(rs.getString(2));
actor.setLastName(rs.getString(3));
actors.add(actor);
}
request.setAttribute("list", actors);
request.getRequestDispatcher("/WEB-INF/sba2/actors.jsp").forward(request, response);
}
else if(tbName.equals("save")) {
int i = stmt.executeUpdate(query); // ★ INSERT는 executeUpdate()로 실행
// ★ INSERT 후 다시 목록 조회해야 하므로 새로운 select 쿼리로 변경
query = "select * from actor order by last_update desc";
rs = stmt.executeQuery(query);
ArrayList<Actor> actors = new ArrayList<Actor>();
Actor actor = null;
while (rs.next()) {
actor = new Actor();
actor.setActorId(rs.getInt(1));
actor.setFirstName(rs.getString(2));
actor.setLastName(rs.getString(3));
actors.add(actor);
}
request.setAttribute("list", actors);
request.getRequestDispatcher("/WEB-INF/sba2/actors.jsp").forward(request, response);
}
} catch(SQLException e) {
System.out.println(e.getMessage());
} finally {
if (rs != null) try { rs.close(); } catch (Exception e) {}
if (pstmt != null) try {pstmt.close(); } catch (Exception e) {}
if (stmt != null) try {stmt.close(); } catch (Exception e) {}
if (conn != null) try {conn.close(); } catch (Exception e) {}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
}
servlet은 request scope와 동일한 기능

전역변수의 단점 : 메모리 가용성이 떨어짐, side effect가 발생할 수 있음
'computing' 카테고리의 다른 글
| 20251127-android13, 그래픽, Empty Views Activity menu해결 (0) | 2025.11.27 |
|---|---|
| 20251124_iOS12 (0) | 2025.11.24 |
| 20251117 - iOS12 (0) | 2025.11.17 |
| android11 (0) | 2025.11.13 |
| 20251103_iOS10 (0) | 2025.11.03 |