본문 바로가기
Develop/JSP

메인 페이지 정리, 페이지 하나로 DB 총 관리하기 (1)

by ys2ys2 2024. 10. 14.

이제 어느정도 페이지 틀은 잡혔고, 기존에 스크립틀릿으로 만든 기능들도 MVC 패턴으로 바꿔놨다.

 

오늘부터 메인페이지 부분을 수정했고 까먹기 전에 공부 겸 정리하기!


인기 여행지 수정하기

 

먼저 인기 여행지 부분을 수정했다.

인기 여행지

 

인기 여행지 부분에 DB에서 가져온(공공데이터 API로 저장한 여행지) 값들로 채워넣어야 했다.

구현하고 싶었던 큰 기능들은

1. DB에서 랜덤으로 계속 바뀌면서 출력하기

2. 이미지 클릭 시 해당하는 여행지 페이지로 이동하기

 

정도였다. 충분히 구현할 수 있다고 생각하고 시작!

 

핫플 페이지에서 DB에 저장된 댓글들을 가져온다고 생각하고 비슷하게 만들어 보려고 했다.

핫플 페이지 여행톡

 

이걸 참고해서! MVC 패턴대로 만들어봤다.

 

Controller

@Autowired
private HotPlaceService hotplaceService;

// 핫플 테이블의 상세 정보를 랜덤으로 가져오기
@GetMapping("/HomePage/mainpage")
public String showHotplaceDetails(Model model) {
 
    List<Map<String, Object>> hotplaceDetails = hotplaceService.getRandomHotplaceDetail(5);

    model.addAttribute("hotplaceDetails", hotplaceDetails);

    return "HomePage/mainpage";
}

 

일단 컨트롤러 먼저!

MainPageController를 만들었고 이렇게 작성했다.

 

일단 Autowired 어노테이션으로 HotPlaceService 인터페이스를 넣었고

HotPlaceService에서 랜덤으로 5개씩 받아오게 했다.

그러고 List로 저장하게 했고 Map:String = 키, Map:Object = 값 으로 했다.

값을 Object로 둔건 가져올 값의 타입이 다양해서 일단 가장 상위 타입인 Object로 두었다.

JSP로 반환하기 위해 Model 객체에 추가했다.

 


 

 

Service

public interface HotPlaceService {

    List<Map<String, Object>> getRandomHotplaceDetail(int limit);

}

 

랜덤으로 지정된 개수(limit) 만큼 DB의 핫플을 가져오려고 했다. 더 자세한건 구현체인 Impl로!

 

 


 

 

 

Impl

@Service
public class HotPlaceServiceImpl implements HotPlaceService {

    @Autowired
    private HotPlaceDAO hotplaceDAO;

// 랜덤으로 hotplace 상세 정보 가져오기 (firstimage 첫 번째 이미지 처리)
@Override
public List<Map<String, Object>> getRandomHotplaceDetail(int limit) {
 
    List<Map<String, Object>> hotplaces = hotplaceDAO.getRandomHotplaceDetail(limit);

    return hotplaces.stream().map(hotplace -> {
        String firstimage = (String) hotplace.get("firstimage");
        if (firstimage != null && firstimage.contains(",")) {
            firstimage = firstimage.split(",")[0].trim();
        }
        hotplace.put("firstimage", firstimage); 
        return hotplace;
    }).collect(Collectors.toList());
 }
}

 

인터페이스에서 정의한 getRandomHotplaceDetail를 구현하려고 했고

limit 값을 받아서 DB에서 해당 개수만큼 데이터를 가져왔다. 이건 DAO로 넘기기!

 

hotplaceDAO를 통해서 DB에서 랜덤으로 limit 개수만큼 핫플레이스 데이터를 가져오게 했다.

DAO는 List<Map<String, Object>>로 Map에 저장되게 했다.

 

근데 문제는 내 DB에 저장되어있는 이미지 값들이 쉼표로 구별된 여러 이미지 주소였다.

그래서 if (firstimage != null && firstimage.contains(","))를 통해서 null이 아니면서 " , " 이 포함되어 있으면

firstimage = firstimage.split(",")[0].trim();를 통해 [0] 번째 부분만 남기게 했다. (0번째 부분이니 실제로는 첫번째)

그러곤 다시 hotplace.put("firstimage", firstimage); // hotplace에 firstimage라는 이름으로 집어넣기!

 

이렇게 해서 랜덤 limt 개수만큼 가져와서 firstimage 작업을 거친 후 다시 List로 저장해놨다.

 

 


 

 

DAO

@Repository
public class HotPlaceDAO {

    @Autowired
    private SqlSession sqlSession;
    private static final String MAPPER = "com.human.web.mapper.HotPlaceMapper";

    public List<Map<String, Object>> getRandomHotplaceDetail(int limit) {
        return sqlSession.selectList(MAPPER + ".getRandomHotplaceDetail", limit);
	}
}

 

getRandomHotplaceDetail로 쿼리ID를 만들었고 이걸 MAPPER로 넘겼다.

뒤에는 limit값을 넣어서 컨트롤러에서 넣은 limit(5)를 받아오게 했다.

@Controller
List<Map<String, Object>> hotplaceDetails = hotplaceService.getRandomHotplaceDetail(5);

 

 


MAPPER

 

<!-- 랜덤 핫플 가져오기 -->
<select id="getRandomHotplaceDetail" resultType="map">
    SELECT contentid, title, firstimage, addr1, overview, mapx, mapy
    FROM hotplace
    ORDER BY RAND()
    LIMIT #{limit} 
</select>

 

DAO에서 설정한 id="getRandomHotplaceDetail"로 호출했고 map을 통해 키:값 쌍으로 저장했다.

일단 뭘 쓸지 몰라서 hotplace 테이블에 있는거 죄다 가져왔다.

contentid, title, firstimage, addr1, overview, mapx, mapy

 

그러고  MySQL에서 제공하는 함수인 RAND()를 통해서 데이터를 랜덤하게 정렬했다.

LIMIT로 행 개수를 제한했고 그 LIMIT값은 #{limit}를 통해 파라미터를 받아서 썼다.

 

이렇게 한바퀴 돌리고 JSP로 전달!


 

JSP

 

	<!-- 인기 여행지 섹션 -->
	<div class="famous">
	  <h2>인기 여행지</h2>
	  <div class="famous-list">
	    <!-- Model에서 전달된 hotplaceTitles 출력 -->
	    <c:forEach var="hotplace" items="${hotplaceDetails}">
	      <div class="famous-item">
	        <!-- 이미지와 타이틀에 링크 추가 -->
	        <a href="${pageContext.request.contextPath}/HotPlace/${hotplace.contentid}">
	          <img src="${hotplace.firstimage}" alt="${hotplace.title}" class="image-placeholder" />
	          <p>${hotplace.title}</p>
	        </a>
	      </div>
	    </c:forEach>
	  </div>
	</div>

 

 

이렇게 c:forEach를 통해서 저장된 값들을 반복 출력했고

hotplaceDetails의 List<Map<String,Object>>형태의 데이터를

hotplace.firstimage 이런 식으로 hotplace라는 Map에서 firstimage라는 키에 해당하는 값을 가져오게 했다.

같은 방식으로 ${hotplace.title}도 해주기!

 

 

RESULT

 

 

랜덤으로 표출하기 성공!

 

요렇게 랜덤으로 이미지 + 제목 가져오기 성공!

 

 


 

 

 

지금까지 진행도

 

 

 

 

 

저 이미지를 누르면 detail.jsp로 이동하고 이동할 때 이미지에 해당하는 contentid값도 같이 가지고 가서

contentid 값

 

 

한 페이지 안에서 틀만 잡고 내용을 contentid에 해당하는 값으로 가져오게 해놨다.

contentid에 해당하는 값들

 

detail.jsp

 

 

이 화면들은 모두 한 페이지에서 구성한다! detail.jsp

 

메인 화면에 뿌려진 어떤 이미지를 클릭해서 들어가도 detail.jsp로 이동되고

이 안에는 틀만 있지만 메인페이지 이미지에서 가져온 contentid 값으로 페이지를 전부 구성되게 했다.

제목은 contentid에 해당하는 title, 사진들은 firstimage, 설명은 overview, 지도는 mapx/mapy로!

 

각각 해당하는 페이지를 만들 필요가 없기 때문에 DB 관리만 잘 해주면 될 것 같다!!

 

 

이것도.. 정리해서 올려 볼 예정!

 

다음엔.. 여행톡 작성하면 해당하는 contentid에 저장되고,

불러올때도 같이 매치시켜서 해당하는 contentid에 저장한 댓글들만 가져오게 하기!

 

할게 많다!!! 차근차근 해 나가야지!