secu.properties
- DB URL, 사용자명, 비밀번호 등을 secu.properties에 저장하여 코드에서 직접 노출되지 않도록 함
- GitHub 업로드 시 보호: .gitignore 파일을 활용하여 secu.properties가 업로드되지 않도록 설정
Spring 코드 작성 흐름 (MVC 패턴)
1. Controller
- 클라이언트 요청을 처리하고 응답 반환
- @RequestMapping, @PostMapping, @GetMapping 등으로 요청을 매핑
- @Autowired를 사용하여 Service 주입
package com.shop.cafe.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.shop.cafe.dto.Member;
import com.shop.cafe.service.MemberService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@RestController
@CrossOrigin("http://127.0.0.1:5500/")
public class MemberController {
@Autowired
MemberService memberService;
@PostMapping("insertMember")
public Map<String, String> insertMember(@RequestBody Member m) {
Map<String, String> responseData = new HashMap();
try {
memberService.insertMember(m);
responseData.put("msg", "ok");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
responseData.put("msg", e.getMessage());
}
return responseData;
}
}
2. DTO (Data Transfer Object)
package com.shop.cafe.dto;
import java.util.Date;
public class Member {
private String email, pwd, nickname;
private Date registDate;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Date getRegistDate() {
return registDate;
}
public void setRegistDate(Date registDate) {
this.registDate = registDate;
}
public Member(String email, String pwd, String nickname, Date registDate) {
super();
this.email = email;
this.pwd = pwd;
this.nickname = nickname;
this.registDate = registDate;
}
public Member() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Member [email=" + email + ", pwd=" + pwd + ", nickname=" + nickname + ", registDate=" + registDate
+ "]";
}
}
3. DAO (Data Access Object)
- DB와 직접 연결되어 데이터 저장 및 조회를 담당
package com.shop.cafe.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
import com.shop.cafe.dto.Member;
@Repository
public class MemberDao {
@Value("${spring.datasource.driver-class-name}")
private String DB_DRIVER;
@Value("${spring.datasource.url}")
private String DB_URL;
@Value("${spring.datasource.username}")
private String DB_USER;
@Value("${spring.datasource.password}")
private String DB_PW;
public void insertMember(Member m) throws Exception {
Class.forName(DB_DRIVER);
String sql = "insert into member(nickname, pwd, email) values(?, ?, ?)";
try(
Connection con = DriverManager.getConnection(DB_URL, DB_USER, DB_PW);
PreparedStatement stmt = con.prepareStatement(sql);
){
stmt.setString(1, m.getNickname());
stmt.setString(2, m.getPwd());
stmt.setString(3, m.getEmail());
int i = stmt.executeUpdate();
System.out.println(i+"행이 insert 되었습니다");
}
}
}
4. Service (비즈니스 로직)
- @Service로 선언하여 비즈니스 로직을 처리.
- @Autowired를 통해 DAO를 주입받아 사용.
package com.shop.cafe.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.shop.cafe.dao.MemberDao;
import com.shop.cafe.dto.Member;
@Service
public class MemberService {
@Autowired
MemberDao memberDao;
public void insertMember(Member m) throws Exception{
memberDao.insertMember(m);
}
public Member login(Member m) throws Exception {
return memberDao.login(m);
}
}
자원 자동 해제 (try-with-resources)
- try(자원 선언) { }을 사용하면 close() 없이 자동으로 해제됨.
의존성 주입 (@Autowired)
- @Autowired를 사용하면 new 키워드 없이 자동으로 객체 주입됨.
HTTP 세션을 활용한 로그인 상태 유지
- 로그인 시 세션에 사용자 정보 저장
HttpSession session = request.getSession();
session.setAttribute("user", loginUser);
- 이후 요청에서 로그인 여부 확인 가능
User user = (User) session.getAttribute("user");
if (user != null) {
System.out.println("로그인 상태 유지 중: " + user.getUsername());
}