중앙정보기술인재개발원/Spring

[Spring] | final project_3

soidev 2025. 5. 1. 09:09


오늘 할 것

글쓰기 & 리스트 출력

 

▼ 오류

application.properties 이쪽 문제일 가능성 높음

데이터베이스 문제!

→ 결과 : 파일 위치가 static안에 있어서 오류가 떴음

 

 

관계형데이터베이스이기때문에

외래키인 테이블은 기본테이블명_아이디명

테이블 정의할때 첫번째는 무조건 primary key

마지막은 created_at!

 

 

BoardServiceImpl.java

package com.ca.finalproject.board.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ca.finalproject.board.mapper.BoardSqlMapper;
import com.ca.finalproject.dto.ArticleDto;
import com.ca.finalproject.dto.UserDto;
import com.ca.finalproject.user.mapper.UserSqlMapper;

@Service
public class BoardServiceImpl {
//하나의 서비스에 두개 이상의 mapper가 존재 할 수 있다! -> 트리 구조
@Autowired
private BoardSqlMapper boardSqlMapper;

@Autowired
private UserSqlMapper userSqlMapper;

public void writeArticle(ArticleDto articleDto){
 
boardSqlMapper.createArticle(articleDto);
}
 
//자료구조
public List<Map<String,Object>> getArticleList(){
List<Map<String,Object>> dataList = new ArrayList<>(); //리스트의 하나에 맵을 담겠다, 리스트에 배열을 생성

List<ArticleDto> articleDtoList = boardSqlMapper.findAll(); //하나의 dto는 하나의 행 근데 걔가 리스트로 들어가있음

for(ArticleDto articleDto :articleDtoList){
 
Map<String,Object> map = new HashMap<>(); //map은 항상 저 구조임 string,object
UserDto userDto = userSqlMapper.findUserById(articleDto.getUserId()); //getId하면 난리남 앤 글 번호임...
//다형성
map.put("userDto", userDto);
map.put("articleDto", articleDto);
dataList.add(map); //한바퀴 돌때마다 맵을 담을것
//결과적으론 배열임
}
return dataList;
}
}

💡 핵심 기능

  • 게시글을 작성하고(writeArticle)
  • 게시글 목록을 가져오는(getArticleList) 서비스 로직을 제공

1. 게시글 작성 

writeArticle(ArticleDto articleDto)

boardSqlMapper.createArticle(articleDto);
  • MyBatis Mapper (BoardSqlMapper) 를 이용해 게시글을 DB에 저장함.
  • 이때 ArticleDto는 하나의 게시글 데이터 객체 (DTO: Data Transfer Object).

2. 게시글 목록 조회 

getArticleList()

🧠 목적

  • 단순히 게시글만 조회하는 게 아니라,
  • 해당 게시글을 작성한 유저 정보(nickname 등)도 함께 조회하고 싶음.
List<ArticleDto> articleDtoList = boardSqlMapper.findAll();
  • DB에서 게시글 전체를 가져옴 → List<ArticleDto> 형태로 자동 매핑됨.
  • MyBatis가 알아서 결과 레코드들을 ArticleDto 객체 배열로 만들어줌.

🎯 왜 복잡하게 맵에 담느냐?

  • 게시글(ArticleDto)만 있으면 되는데, 작성자의 닉네임 같은 UserDto 정보가 필요하기 때문.
  • DB에서 조인을 직접 하지 않고, Java에서 논리적으로 조인하는 방식으로 처리함.
for(ArticleDto articleDto :articleDtoList){
UserDto userDto = userSqlMapper.findUserById(articleDto.getUserId());
//다형성
map.put("userDto", userDto);
map.put("articleDto", articleDto);
dataList.add(map);
}
return dataList;

🔍 이 부분 설명

  • 게시글을 하나씩 꺼내서 반복
  • 그 게시글을 쓴 사람의 userId로 UserDto를 추가로 조회
    • → 사실상 Java 코드에서 조인 처리하는 것
  • 게시글 + 작성자 정보를 하나의 Map에 담음
  • 이 Map을 리스트에 추가함
  • article의 userid가 user의id 동일한 값! - > 특정글에 대한 정보 이 글의 쓴 사람의 user정보

🧶 최종 구조

  • dataList는 전체 게시글 데이터
  • Map 하나하나에 articleDto, userDto 두 개의 객체가 함께 들어 있음

🤔 왜 이렇게 했을까?

만약 게시글에 작성자 정보가 필요 없었다면, 그냥 findAll()만 써도 됐음
하지만 작성자의 닉네임 같은 정보가 필요해서, User 테이블도 함께 접근해야 함
그리고 이걸 MyBatis에서 조인 쿼리로 해결하지 않고, Java 코드에서 따로 불러오는 구조로 간 것

✏️ 추가 개념

  • map은 서로 다른 형태의 객체를 묶기에 적합한 자료구조
  • List<Map<...>>는 흔히 게시글 목록 화면에서 각 게시글과 작성자 정보를 한 번에 보여주기 위해 사용됨
  • 이렇게 만들어진 dataList는 나중에 Model에 담겨서 JSP 같은 뷰에서 사용할 수 있음

 

✅ Spring MVC에서 데이터 전달 흐름 요약

1. Model이란?

  • Spring이 제공하는 인터페이스(API) 중 하나
  • Controller에서 데이터를 담는 공간
  • request.setAttribute()처럼 데이터를 담아두는 역할을 함
model.addAttribute("dataList", dataList);
  • 이렇게 담은 데이터는 View(JSP) 로 전달됨
  • 즉, Controller → View 사이에서만 사용되는 임시 저장소

2. 🔄 Model은 언제까지 유지될까?

  • 한 번의 요청(Request) 이 끝날 때까지만 유지됨
  • → 요청-응답 끝나면 날아감 (request 범위)

3. ☑️ Model vs HttpServletRequest

제공자 Spring Servlet (자바 EE)
사용 방식 addAttribute() setAttribute()
유지 범위 한 요청 동안 한 요청 동안
역할 View로 데이터 전달 같은 역할 (Spring이 Model로 추상화한 것)

 

4. 🤝 HttpSession이란?

  • Servlet에서 제공하는 또 하나의 저장소
  • 사용자(브라우저)가 접속한 상태를 유지할 때 사용
  • 로그인 같은 상태 유지 정보 저장에 활용
  • 유지 범위: 브라우저 창을 닫거나 로그아웃하거나 세션 타임아웃 전까지
  • 한 번 저장하면 여러 요청(request) 간에도 계속 사용할 수 있음 (session 범위)

🔗 전체 구조 계층 순서

List
 └── Map (1)
      ├── "articleDto" → ArticleDto 객체
      │                 ├── articleId
      │                 ├── userId
      │                 ├── title
      │                 ├── content
      │                 └── ...기타 필드
      │
      └── "userDto"    → UserDto 객체
                        ├── id
                        ├── nickname
                        ├── email
                        └── ...기타 필드

 └── Map (2)
      ├── articleDto → ...
      └── userDto    → ...
 
(계속 반복)

결과값
로그아웃 했으 시 화면

'중앙정보기술인재개발원 > Spring' 카테고리의 다른 글

[Spring] | 세션,쿠키,Session,Cookie  (0) 2025.05.02
[Spring] final project_4  (0) 2025.05.02
[Spring] | final projcet_2  (0) 2025.04.29
[Spring] | final project_1  (0) 2025.04.28
[Spring] 개발 환경 셋팅  (0) 2025.04.24