오늘 할 것
글쓰기 & 리스트 출력
▼ 오류

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 |