반응형

오늘은 핀란드 근교 산책 및 평소에 가보고 싶었던
핀란드 타이 음식점에 대해 소개해보려고 한다.

일단 핀란드 패스권이

내가 지금 c존에서 사는데 a존까지 가려면
ABC로 가는 패스권을 사야한다.

에게 44유로다 일주일권이..
물론 안사고 타다 걸리면 벌금 80유로

내가 생각하기에는 핀란드는
서비스요금 및 교통요금이 생각보다 비싸다
시티즌이라면 30일권이 싸서 그렇게 다니겠지만 ..
7일에 6만원이라는 돈을 매번 지불하니 ;; 좀 꺼림 직 하다 .

암튼 표를 사고 헬싱키로 가보자

몇번 을 보지만 유럽 건물은 참 멋있게 잘 꾸미는거 같다 일단 오래된 건물이라 그런가
참 근사하다.

부활절이라는데 마녀는 왜있을까?
부활절을 맞이 하여 마트에서는 달걀 모양의 초콜릿을 많이 판매 한다.

이렇게 헬싱키 산책을 마치고
비건 타이 음식점에 갔다.

비건 타이 음식점이라길래 ??
처음에는 이런 반응 을 보였지만
생각보다 엄청 많은 사람들이 방문해서 놀랐다.


나도 나중에 비건 코리안푸드점을 하나 창업하고 싶었다..


가격은 1인당 17.5유로 정도 이며 2명에 35유로
한국 돈으로 약 45000원 정도 준거 같다.
역시 유럽 물가 사악하다. 하지만
이정도 퀄리티라면 괜찮은거 같다 더군다가 붸페이니 말이다.
서버가 영어를 써서 좋았다. 태국분이라서 그런가 .
말도 좀 잘 통하고 전체적으로 채식에 베이스 지만 .
태국음식 본연의 맛은 잘 살아 있지 않았다.
핀란드 인의 입맛에 맞춘 음식이라 현지화가 된 것도 문제라고 본다.
하지만 전체적인 음식의 퀄리티 등 괜찮았다.




그리고 이제 다 먹고 메인 스테이션으로 돌아가려는데
이런 우크라이나 전쟁에대한 그래비티가 많았다.
참여러가지로 생각을 하게 되는 유럽 생활인거 같다.

무슨일 이 있던 전쟁은 하지 않으면 좋은데 벌써
핀란드에도 2만명 정도가 되는 난민을 받았다고 한다.
참 .. 아이러니 하지만 그들도 빨리 고국 땅에서 편히 발을 뻗고 자면 좋겠다.

푸틴때문에 외식물가도 비싸지고 .. 증말 거덜나것다..

핀란드에 온지도 언 9일차 끝!!

반응형
반응형

매일 앉아서 코딩이랑 블로그질을 해서 좀 나가야 겠다는 생각이 들었다.

하지만 계속 4월에도 눈이 오는 충격적인 날씨 덕분에 ㅠㅠ 

좀처럼 걷기가 힘들다 

 

그래서 일단 버스를 타고 하가니애미까지 갔다

 

그래서 메인 스테이션까지 걸어보기로 했다. 

 

날씨가 그렇게 좋지는 못하지만 걸을만 하다

중간 중간 이런 새들이 엄청 모여있다. 

거의 중형견 크기 정도 되는 듯 하다

이런 새라는데 나는 핀란드어나 스웨덴어를 할줄 모르기 떄문에 

무슨 새인지 모른다 하지만 

청동오리 백조는 알거같다.

불광천에서도 많이 보이더마..

 

그리고 점심겸 저녘으로 

이탈리아 수제비(?) 느낌으로 뇨끼를 먹었다. 

뇨끼는 감자로 만들었는데

먹을때마다 식감이 너무 좋다. 

이식감을 싫어하는 사람도 있다고 한다 호불호가 갈리는 음식은 아닌거 같지만

위에 소스는 여자친구가 만든 소스인데

토마토보울을  6개 정도 만들고 큰 콩과 뭘 섞더라

집안 기밀인가 레시피를 안알려준다.

 

하지만 정말 맛있다

 

ㅋㅋ 

 

이제 코딩도 시작단계에서 이제 서버쪽을 작업하고 있다.

 

너무 좋다 잘되서 오류와의 싸움이지만 ㅋㅋ 

 

취뽀까지 화이팅 이며 한국에 언제 돌아갈지모르지만

반응형
반응형

벌써 핀란드에 온지 일주일이 지났다. 

시간이 정말 빠른거 같다. ㅎㅎ 

 

개발도 하고 평소 요리가 취미라 이것저것 만들면서 

깃헙 및 블로그도 많이 쓰고 유럽에서 생각보다 심심할 줄 알았는데

너무 바빠 놀랏다. 

 

매일 각기 다른 식재료로 무슨 요리를 할까도 생각하고

사이트는 어떻게 구성할까도 생각하고 

 

핀란드 문화도 체험하고 여러모로 바쁘다 ㅋㅋ 

 

오늘의 요리 

 

아보카도 파스타

 

재료 (2인분 기준)

버섯 1개 

아보카도 1개 중간크기 성인 주먹크기?

파스타 250g 

파 조금 

각종 야채를 넣어준다. 

 

 

1) 아보카도를잘라 이런 형태로 갈아라 블랜더를 써도 좋은데

나는 씹는 질감을 위해 그냥 썻다. 

 

2. 야채 손질

3) 볶아라 

4) 파스타 면에 소금을 넣고 약 10분정도 끓는 물에서 끓여준다.

5) 볶은 채소와 면을 볶아주고 

나중에 불을 끄고 팬의 잔열에 아보카도 소스를 볶아주면

완성 아보카도의 크리미한 질감과 짠맛이 조화가 좋다. 

 

그리고 요곤 아침으로 먹은 가지 덮밥

 

아침에 먹기 간단하면서도 먹음직 스럽다!! 

 

 

반응형
반응형

오늘은 원래 어드민페이지 올리려고했는데

요즘 새롭게 만들고 있는사이트에 배포까지 하려고한다. 

그래서 카페24를 통해 하려고 하고 무료여야해서 mysql을 쓰게되었다

하지만 나는 한번도 mysql을 써본적이 없다. 

오라클만 써보아서 .. 음 .. 오라클이랑 대충 비슷하겟거니 하면서 일단 깔앗다.

 

https://dev.mysql.com/downloads/mysql/

 

MySQL :: Download MySQL Community Server

Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Debian Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris macOS Source Code Select OS Version: All Windows (x86

dev.mysql.com

일단 여기서 mysql을 설치해주면 

워크벤치를 설정해준다. 

 

오라클이랑 다른점은 

오라클은 유저가 곧 데이터 베이스(스키마)라는 것인데. 

mysql은 아니었다.

나는 유저 root를 만들고 응? 여기서 테이블을 어떻게 만들어야하지?? 이랫다가

바보였다. .

 

스키마 > 테이블 > 컬럼 

이렇게  스키마 안에 테이블이 있는것이다.

 

먼저 워크 벤치에서 스키마 부터 만들자 

 

 

대략 요기서 스키마 부터 만들고 나면 

 

이렇게 recipe_db라고 생겼다!! 

 

그럼 일단 mysql은 준비가 다된 것이다. 

 

이제 이클립스로 넘어가보자 

 

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>

    <!-- MyBatis 3.4.1 -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
    </dependency>


    <!-- MyBatis-Spring -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>

    <!-- Spring-jdbc -->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>

    <!-- Spring-test -->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>

	<!-- Mybatis log -->
    <!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 -->
    <dependency>
        <groupId>org.bgee.log4jdbc-log4j2</groupId>
        <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
        <version>1.16</version>
    </dependency>

이렇게 우선 pom.xml에다 디펜던시를 등록해주자 

그럼 쓸 수 있는 환경은 끝낫다.

 

아 맞다 나는

		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>3.3.1</version>
		</dependency>

커넥션 풀로 히카리CP를 썻다. 이게 제일 익숙하다

 

그 후 root-context.xml에서 커넥션 풀 설정을 해주자 

 

   <!-- 히카리 커넥션 DB 설정 -->
   <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
      <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
      <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/디비 이름(스키마이름)?useSSL=false&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true" />
      <property name="username" value="mysql 아이디" />
      <property name="password" value="mysql 비밀번호" />
   </bean>
	
	<!-- 위에 설정한 DB정보를 데이터소스 객체에 주입 -->
   <bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
      <constructor-arg ref="hikariConfig" />
   </bean>

을 설정 해주자 

 

그리고 아까 확인한 junit으로 테스트를 해보자 :) 

 

나는 테스트페이지에 testVegan 이라는 클래스를 생성 했다. 

 

package com.vegan.recipe;

import java.sql.Connection;
import java.sql.DriverManager;

import org.junit.Test;

public class testVegan {
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/recipe_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"; 
private static final String USER = "recipe"; 
private static final String PW = "********";
@Test
public void testConnection() throws Exception{
	Class.forName(DRIVER); try(Connection conn = DriverManager.getConnection(URL, USER, PW)){ 
		System.out.println(conn);
	 } catch (Exception e) { 
		 e.printStackTrace();
	}
}
}

 

 

테스트 코드는 상단 과 같으며

결과는 성공 했다 .

 

아 그리고.. 테스트와 루트xml에 들어가는 url이 살짝 다르니 참고 바란다.

xml에서는 & 인식할 수가 없어 

&amp;을 사용하였다.

 

이렇게 해서 매퍼를 연결시켜 주면 끝 

 

서버를 올려보면

 

 

이렇게 내가 만든 웹페이지가 뜬다

 

mysql 혼자 처음부터 공부하니 한 4시간 정도 걸려서 여기 까지온거같다.

 

내가 한 코드를 참고 바라며

나중에 또 프로젝트 할때 참고 해야겠다. 

 

https://github.com/MoonSeokHyun

 

 

반응형
반응형

 오늘은 눈이 엄청 왔다... 

입국 첫날부터 3일째까지는 그렇게 맑더니 어제부터

ㅠㅠ 오늘 그라탕마드려고

프리스마에 갔는데 와.. 진짜 눈때문에 눈을 뜰수가 없을 정도이다. 

 

가는길에 안경이랑 난리다 눈도 뜨기 힘들어서 정말.. ㅠㅜㅠㅜ 

 

그래서 사왔다.

 

프리스마에서 옥수수통조림이 영어로 기억이 안나서

뭐지 Corn ... can.. corn? 

알고보니 canned corn 이더라 ;; 

 

다행히 알아들어준 직원 분 덕에 삿다

 

이제부터 만들어보자 

 

오늘의 재료 

1) 옥수수통조림

2) 고구마

3) 비건치즈 

4) 콩고기

5) 양파

 

소스

소금 후추 끗

 

 

이렇게 재료들을 준비해 넣고 

 

이렇게 고구마를 삶아서 으꺠서 보울에 넣어준다. 

그 후 양파를 잘개 다져 콩고기랑 기름을 살짝 넣고 볶아준다. 

 

그 뒤 소금 살짝 후추 살짝으로 간을 해준다.

어차피 치즈가 간을 대신 해주기 떄문에 필요 없기도 하다. 

 

다 넣고 스까준다.

 

그리고 나서 오븐전용 용기에다 담아준다.

대충 치즈도 이렇게 올려준다.

 

구다치즈 & 체다치즈 조합이다.

핀란드 에서는 여러가지 비건치즈를 쉽게 구할 수 있어서 좋다. 

 

 

그리고 나서 

200도에서 20분 정도 해주면 되는데 ...

 

간과한 사실이 있다. ㅜㅜㅜ 

 

잘 안녹는다.

 

그래서 그냥 먹자..

 

완성된 고구마 그라탕

 

실제로 먹어보면

고구마의 달콤함과 구다치즈의 진득한 치즈의 맛이

생각보다 조합이 괜찮다

 

나중에 크리스마스 파티 음식으로도 괜찮을 듯 싶다. 

ㅎㅎ 

 

 

반응형
반응형

다중게시판 및 댓글 및 CK에디터까지 블로그에 글을 썻다

이제 남은것은 거의 .. 관리자페이지인거 같다. 

 

위와 같은 관리자 페이지 이며 오늘은 회원 관리 만드는 법에 대해서 알아보고자 한다. 

 

회원관리는 위와 같은 페이지로 이루어 져있으며

데이터 테이블을 통해 검색 및 페이지네이션까지 구현하였다. 

기능을 살펴보자면 

 

이름을 클릭하면 해당하는 회원 정보를 볼 수있다. 

 

게시글 수 및 댓글 수를 클릭하면 해당 아이디가 쓴 게시글 및 댓글을 볼 수 있다. 

 

다 모달을 통해 볼 수 있다. 그렇다 모달은 참 귀찮다. ;;

 

1. 회원 정보

회원 정보를 볼 수 있음 

 

2. 작성 게시물

3. 쓴 댓글

 

4. 회원 관리

가입 승인 , 가입 대기, 가입거절 , 회원 추방

이렇게 4개를 가지고  회원 을 가입한다.

 

회원이 처음 가입하면 대기 상태이며

관리자가 확인 후에 가입 승인을 해준다. 

 

같은 화면에서 드롭시킬 수도있다. 

 

자 이제 만들어 보자 

 

관리자 같은경우는 따로 테이블을 제작 할 필요는 없다.

유저를 만들때 관리자는 1 일반유저는 0 이렇게 구분해 두었기 떄문에

 

일반 유저는 어드민페이지에 접근할 수없도록 세션값으로 조정해준다. 

 

각 기능 별로 담기는 너무 길이가 길어지니 컨트롤러 리뷰 뷰 리뷰 이런식으로 해야겠다.. 

 


1. 컨트롤러

package com.community.shy.board.controller;

import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.community.shy.board.JobBoard.service.IBoardService;
import com.community.shy.board.JobComment.service.ICommentService;
import com.community.shy.board.command.BoardVO;
import com.community.shy.board.command.CommentVO;
import com.community.shy.user.UserVO;
import com.community.shy.user.service.IUserService;

@Controller
@RequestMapping("/admin")
public class AdminController {
	
	
	@Autowired
	private IBoardService service; 
	
	@Autowired
	private IUserService UserService;
	
	@Autowired ICommentService comService;

	@GetMapping("/admin_main")
	public void main(Model model) {
		System.out.println("메인 페이지로 이동");
		model.addAttribute("boardList", service.getAdminList());
		model.addAttribute("userInfo",UserService.adminUserList());
		
	}
	
	@GetMapping("/admin_boardList")
	public void mainList(Model model) {
		System.out.println("어드민메인 게시판 리스트");
		model.addAttribute("allBoard", service.getAllboard());
	}
	
	// 어드민 회원 관리
	@GetMapping("/admin_userList")
	public void user_list(Model model) {
		//회원 기본정보 페이징(x)
		System.out.println("/admin_userList 요청");
		List<UserVO> list = UserService.adminUserList2();
		model.addAttribute("userInfo",list);
		
		
	};
	
	@ResponseBody
	@PostMapping("/getuserInfo")
	public UserVO getuserInfo(String id) {
		System.out.println("유저 인포 아작스");
		UserVO user = UserService.getInfo(id);
		return user;
	}
	
	@ResponseBody
	@PostMapping("/getUserBoardList")
	public List<BoardVO> getUserBoardList(String board_writer) {
		System.out.println("open! user boardList ajax!");
		System.out.println("조회할 회원 아이디 : " + board_writer);
		List<BoardVO> list = service.getUserBoardList(board_writer);
		
		return list;
	}
	@ResponseBody
	@PostMapping("/getCommentList")
	public List<CommentVO> getCommentList(String com_writer){
		System.out.println("open! user Comment List ajax!");
		System.out.println("조회할 회원 아이디 : " + com_writer);
		List<CommentVO> list = comService.getComList(com_writer);
		System.out.println(list);
		return list;
	}
	
	@ResponseBody
	@PostMapping("/successId")
	public void successId(String id) {
		System.out.println(id);
		System.out.println("open! user sign success Id ajax!");
		UserService.successId(id);
	}
	
	@ResponseBody
	@PostMapping("/failId")
	public void failId(String id) {
		System.out.println(id);
		System.out.println("open! user sign failId Id ajax!");
		UserService.failed(id);
	}
	
	@ResponseBody
	@PostMapping("/deleteBoard")
	public void deleteBoard(int board_no) {
		System.out.println("삭제할 게시물 : " + board_no);
		service.JBoardDelete(board_no);
	}
	
	@GetMapping("/admin_dataTotal")
	public void admin_dataTotal(Model model) {
		model.addAttribute("allTotal", service.getAllTotal());
	}
	
	@ResponseBody
	@PostMapping("/findDate")
	public List<HashMap<String, Object>> admin_findDate(String date1 , String date2) {
		System.out.println(date1);
		System.out.println(date2);
		List<HashMap<String, Object>> list = service.admin_findDate(date1, date2);
		System.out.println(service.admin_findDate(date1, date2));
		return list;
	}
	
	@ResponseBody
	@PostMapping("/dropId")
	public void dropID(String id) {
		UserService.dropUser(id);
	}
}

우선 main으로 이동시켜 주어 model 객체로 

유저리스트와 게시판을 실시간으로 업데이트 해준다. 

 

그 뒤 어드민 페이지로 이동해 모든 회원 정보를 불러온다. 

 

   <select id="adminUserList2"
      resultMap="UserInfo">
   select u.*,
    (select count(*) from job_board where board_writer = u.user_id) as board_cnt,
    (select count(*) from job_comment where com_writer = u.user_id) as comment_cnt
    
   from user_info u
   order by u.user_no desc

   </select>

매퍼에서 이렇게 가져올 경우 

VO도 수정해 주어야 한다 서브쿼리로 board_cnt와 comment_cnt가 추가 되어

불러오려면

 

	private int userNo;
	private String userId;
	private String userName;
	private String userPw;
	private String userPh;
	private int userAdr1;
	private String userAdr2;
	private String userAdr3;
	private String userAdr4;
	private int userStatus;
	private String userEmail;
	private String userCompany;
	private int adminType;
	private int userPass;
	private Timestamp userDate;
	private int boardCnt;
	private int commentCnt

userVO에 서브쿼리에 선언문을 추가해준다. 

 

그 뒤 서비스와 매퍼를 거쳐 

리스트 타입으로 받아 주어 모델로 해당 뷰에 뿌려준다. 

 

      <div class="member_list" >
        <table class="admin_board_wrap" id="user-admin">
          <thead class="admin_boardList">
            <th class="admin_board_head">이름</th>
            <th class="admin_board_head">아이디</th>
            <th class="admin_board_head">현재상태</th>
            <th class="admin_board_head">가입일</th>
            <th class="admin_board_head">게시글수</th>
            <th class="admin_board_head">댓글수</th>
            <th class="admin_board_head">가입승인</th>
          </thead>
          <tbody>
          <c:forEach var="vo" items="${userInfo}">
            <tr class="admin_board_content">
              <td class="admin_board_content_nm"><a class="mypageModal user_id" value="${vo.userId}">${vo.userId}</a> </td>
              <td class="admin_board_content_nm">${vo.userName}</td>
              <td class="admin_board_content_nm">
              			<c:choose>
              				<c:when test="${vo.userStatus== 0}">취업준비생</c:when>
              				<c:when test="${vo.userStatus== 1}">직장인</c:when>
              			</c:choose>	
              </td>
              <td class="admin_board_content_nm">${vo.userDate}</td>
              <td class="admin_board_content_nm"><a href="#" class="modal_boardList_admin" data-user-id ="${vo.userId}">${vo.boardCnt}</a></td>
              <td class="admin_board_content_nm"><a href="#" class="modal_reply_admin" data-user-id ="${vo.userId}">${vo.commentCnt}</a></td>
			  <c:choose>
			  	<c:when test="${vo.userPass == 0}">
			  	<td class="admin_board_content_nm">
	                <button data-user-id ="${vo.userId}" type="button" value="승인" class="appro">승인 </button>
	                <button data-user-id ="${vo.userId}" type="button" value="거부" class="deni">거부</button>
                </td>
			  	</c:when>
			  	<c:when test="${vo.userPass == 1}">
			  	<td class="admin_board_content_nm">
	                <button data-user-id ="${vo.userId}" type="button" value="승인" class="userDrop">회원 추방</button>
                </td>
			  	</c:when>
			  	<c:when test="${vo.userPass == 3}">
			  	 	<td>추방회원</td>
			  	</c:when>
			  	<c:when test="${vo.userPass == 2 }">
			  		<td>승인거절회원</td>
			  	</c:when>
			  </c:choose>
            </tr>
            </c:forEach>
          </tbody>
        </table>

 

우선 userInfo로 모델로 뿌려 주어 jstl로 반복문을 돌려주면 

아래와 같이 쫙쫙 뿌려준다. 여기서 데이터테이블로 테이블을 구성하여

페이징 을 구현 하였다. 

가입 승인 이쪽은 

처음 가입할경우 0

가입승인 : 1 

가입거절 : 2

회원추방 : 3

 

이렇게 코드가 작성되어있기 떄문에 C:IF로 처리 되어있다. 

 

이제 이름을 선택하여 AJAX로 모달에 데이터를 뿌려주자.

 

$('.mypageModal').click(function () {
          $('.mypage_modal').fadeIn(500);
          var Id = $(this).attr('value');
          console.log(Id);
          // 아이디 값 불러옴 
          
          $.ajax({
        	type : 'post',
        	url: '<c:url value="/admin/getuserInfo" />',
        	data : {
        		id : Id,
        	},
        	dataType:"json",
        	success : function(data){
        		console.log(data.userName);
        		console.log(data.userId);
        		$("input[name='name']").val(data.userName);
        		$("input[name='id']").val(data.userId);
        		$("input[name='phone']").val(data.userPh);
        		$("input[name='addr1']").val(data.userAdr3);
        		$("input[name='addr2']").val(data.userAdr2);
        		$("input[name='addr3']").val(data.userAdr4);
        		$("input[name='addr_num']").val(data.userAdr1);
        		$(".memInfo").html(data.userName+"님의 회원 정보");
        	},error : function(status, error) {
				console.log('에러발생!!');

				console.log(status, error);
			}
        	
        	
          })//ajax 종료

우선

   var Id = $(this).attr('value');로 해당 아이디를 찍으면 

Value값을 불러오게 하자 그 뒤 ajax를 실행 시킨다. 

 

컨트롤러 getuserInfo를 작성해보자.

	@ResponseBody
	@PostMapping("/getuserInfo")
	public UserVO getuserInfo(String id) {
		System.out.println("유저 인포 아작스");
		UserVO user = UserService.getInfo(id);
		return user;
	}

 

user 타입으로 받아야 하기 떄문에 userVO 타입으로 선언해주고

아까 찍은 파라미터를 넘겨준다. 

 

이제 매퍼를 보자

 

<select id="getInfo" resultMap="UserInfo">SELECT *FROM user_info WHERE user_id = #{id} </select>

로 불러왔으면 컨트롤러에서 이제 user이름으로 리턴을 해준다. 

 

ajax라 따로 모델로 넘겨주거나 하지않는다. 

 

다시 ajax를 보면 

 

success : function(data){
        		console.log(data.userName);
        		console.log(data.userId);
        		$("input[name='name']").val(data.userName);
        		$("input[name='id']").val(data.userId);
        		$("input[name='phone']").val(data.userPh);
        		$("input[name='addr1']").val(data.userAdr3);
        		$("input[name='addr2']").val(data.userAdr2);
        		$("input[name='addr3']").val(data.userAdr4);
        		$("input[name='addr_num']").val(data.userAdr1);
        		$(".memInfo").html(data.userName+"님의 회원 정보");

data로 user의 정보를 받기 떄문에 

모달 input에 넣어 주면된다. 

 

이렇게 하면 우선 ajax로 마이페이지 끗 :) 

 

다음은 게시판을 해보자 게시판이나 댓글이나 똑같으니 

게시판만 하는법을 정리해보자 

 

게시판을 불러오는 ajax이다. 

$('.modal_boardList_admin').click(function () {
        	var board_id = $(this).data("userId");
        	console.log(board_id);

        	getList(true, board_id);
          $('.modal_list').fadeIn(500);
        }); // open modal end
        
        function getList(reset, board_id) {
        	
        	if(reset) {
        		str = '';
        	}
        	
        	$.ajax({
        		type : 'post',
        		url : '<c:url value ="/admin/getUserBoardList"/>',
                data : {
                	board_writer : board_id,
                	},
        		dataType : "json",
        		success : function(data) {
					for(var i = 1 in data){
						console.log(data[i].board_title);
						str += "<tr class='admin_boardM_content'>"
						str += "<td class='admin_boardM_nm'><a href='#'>"+data[i].board_no+"</a></td>"
						str += "<td class='admin_boardM_nm'><a href='#'>"+data[i].board_title+"</a></td>"
						str += "<td class='admin_boardM_nm'><a href='#'>"+timeStamp(data[i].board_regdate)+"</a></td>"
						str += "<td class='admin_boardM_nm'>"+data[i].board_hit+"</td>"
						str += "<td class='admin_boardM_nm'>"+data[i].board_like+"</td>"
						str += "</tr>"
					}
					$('#ListName').html(board_id + '님의 작성 게시물')
					$('#getBoardList').html(str); 
					$("#comment-admin").DataTable();
				},error : function(status, error) {
					console.log('에러발생!!');
					console.log(status, error);
				}

	          });//ajax 종료
		}

우선 var board_id = $(this).data("userId"); 

제이쿼리로 아이디 값을 지목을 해주고 

이대로 바로 ajax를 실행할 경우 

아이디를 누를 경우 계속 중첩해서 나오기 떄문에 닫기버튼을 누르거나 아이디를 클릭

할때 한번 초기화 해주는 것이 중요하다. 

 

이것을 getList(true, board_id);로 부르자

 

우선 reset이 true라면 str을 초기화 해주자 

그럼 중첩되지 않고 기존 데이터를 날리고 새롭게 추가 될 것이다. 

 

그 후 ajax를 해주면 된다. 

좀 노가다 긴한데 댓글이랑 비슷하다.

 

리스트 타입으로 전달받은 data를data가 끝날때 까지 반복한다. 

 

그럼 이제 

getUserBoardList 컨트롤러로 가보자

 

	@ResponseBody
	@PostMapping("/getUserBoardList")
	public List<BoardVO> getUserBoardList(String board_writer) {
		System.out.println("open! user boardList ajax!");
		System.out.println("조회할 회원 아이디 : " + board_writer);
		List<BoardVO> list = service.getUserBoardList(board_writer);
		
		return list;
	}

조회할 아이디를 ajax로 보내주고 

매퍼를 보자

 

    <select id="getUserBoardList" resultType="com.community.shy.board.command.BoardVO">
         select * from job_board where board_writer = #{board_writer}
      </select>

매퍼를 보면 참 간단하다. 이 아이디로 조회된 것들을 모두 다 가져온다. 

 

그럼 실행 되면서 해당 아이디로 조회된 모든 값을 전달 해주고 

모달에 제이쿼리 함수인 html()로 추가해주면 된다.

 

실행 순서는 다음과 같다. 

 

1) 아이디를 누른다.

이때 getList에 reset이 초기화 되면서 빈 문자열로 만들어준다.

2) 아이디값을 ajax로 받아온다. 

3) ajax로 받아온 값을 컨트롤러로 전달한다. 

4) 서비스와 매퍼를 거쳐 매퍼에서 조회된 값을 다시 컨트롤러로 전달한다.

5) 컨트롤러에서 다시 ajax로 리턴한다. 

6) 리턴된 값은 success에 값인 data로 받는다.

7) data에는 해당 아이디의 조회된 값을 가지고 있으니 반복문을 돌려 다 털어준다. 

 8) html()로 추가해 주면 끝난다. 

 

 

이렇게 하면 종료된다. 

 

너무 길어서 2부로 제작해야 겟다. .

 

https://github.com/MoonSeokHyun/JobJob_community

 

반응형
반응형

국비학원 프로젝트 이후 핀란드에 넘어와 

무슨 프로젝트를 할까 고민하던 차에 이전 조별 프로젝트에서 인상깊게 보았던

앨범형 게시판에 의거 하여 레시피 사이트를 제작해보려고 한다. 

 

메인페이지에 헤더 및 배너 부분이다. 

약 5개의 카테고리로 구분될 것이며

비건레시피 비건뉴스 비건이라? 비건수다방(채팅) 레시피자랑하기

로 구분되어 게시판1개 관리자게시판 1개로 구분된다. 

 

 

아래 비건 뉴스는 카드 뉴스 형식으로써 각종 뉴스를 제공하려고 한다.

비건 뉴스 카테고리와 접목해서 게시판을 올릴때마다 이곳에서는 3개만 보여지도록 하려고 한다. 

 

이것을 누르면 비건에대해서 보여주려고 한다. 

 

푸터 부분 

이렇게 해서 메인페이지에 대한 기초 사항은 끝낫고

이제 로그인, 회원가입, 게시판, 인포, 채팅창 등등 뷰 만 찍어내고 

 

빨리 스프링에 들어가야겠다 !! 

반응형
반응형

오늘은 아침부터 눈이왔다.

친구가 10시 까지 대학교에 가기 때문에 아침을 빨리먹고
차리는건 나지만 된장국 및 김 두부부침 등을해서 급한 아침을 해결했다.
밥은 어제 해놔서 다른거 준비하는데 어려움이 없었는데
아침에 된장국 끓이다가 소금을 이빠이 넣어서 ;; 욕봤다.

10시 부터 12시 반까지
점심 + 새로운 사이트 메인페이지를 제작한 뒤

친구가 있는 헬싱키 대학교로 갔다 .

다행히 버스로 한번에 가는 버스가 있어서
약 30분 정도를 달려 헬싱키대학교에 도착하였다.


다시보지만 헬싱키 대학교는 참 멋진 건물들이 많다.
친구는 2층 연구실에서 연구하고 있어서 중국인 유학생인척 하고 코딩할 정보를 보고 있으니
친구가 나왔다.

그 뒤 헬싱키 시내로가 아시아마켓 + 무지 + 기간티를 본 뒤 집에 와서
좀 쉬다 비건 피자를 만들었따.

오늘의 재료(2인분 기준)
마늘 10개
가지 반통
애호박 반통
비건치즈(체다 + 일반)
올리브
콩고기
버섯류
토마토소스
반죽

이렇게 이다.


대략 이렇게 준비 한뒤에


소스를 발라준 뒤 이렇게 토핑을 막 뿌려대면 된다.

그 후 250도에서 약 13분 정도 구우면

요로코롬 완성 됬다.

이제 무알콜 맥주랑 같이 먹으니까 피맥하는거 같다 기분이 좋다
오늘도 1만보 넘게 걸었네
매일 코딩할 거생각하니 기분이 좋다 바쁘게 살아가는게
요즘은 앨범형 게시판에 대해서 썸네일을 어떻게 할 것인가 에 대해서 고민하고 있다.

빨리 페이지 찍어 내고 스프링좀 들어가봐야겠다!

오늘의 일기 끝

반응형
반응형

이번 시간에는 이전에 프로젝트 때 작업 했던 

위 와같은 댓글이 달리도록 한번 작성해보자 

 

그럼 Let's GO 

 


1.  댓글 테이블 제작 및 vo 클래스 제작

 

데이터 베이스 같은경우 오라클을 사용하였다. 

 

import java.sql.Timestamp;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class CommentVO {
	
	private int com_no;
	private String com_writer;
	private String com_content;
	private int com_like;
	private int com_hate;
	private String re_com;
	private int com_type;
	private Timestamp com_regdate;
	private int com_bno;
}

 

위 와같이 코드가 작성되고 컬럼명은 VO와 동일하게 제작했댜.

 


서비스와 매퍼 객체를 만들어보자 

 

public interface ICommentService {
	
	
	void CommentRegist(CommentVO vo); //댓글 등록
	List<CommentVO> getList(int com_bno); //목록 요청
	int getTotal(int com_bno); //댓글 개수
	List<CommentVO> myRecord(String writer);
	void commentDelete(CommentVO vo);
	
	List<CommentVO> getComList(String com_wrtier); //어드민용 회원 댓글 불러오긔

}

인터페이스 서비스와 매퍼객체 똑같이 만들어준다. 

 

그 뒤 서비스를 포함한 클래스를 만들어준다. 

 

package com.community.shy.board.JobComment.service;

import java.util.List;

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

import com.community.shy.board.JobComment.mapper.ICommentMapper;
import com.community.shy.board.command.CommentVO;
@Service
public class CommentService implements ICommentService {

	@Autowired
	private ICommentMapper mapper;
	
	@Override
	public void CommentRegist(CommentVO vo) {
		mapper.CommentRegist(vo);

	}

	@Override
	public List<CommentVO> getList(int com_bno) {
		return mapper.getList(com_bno);
	}

	@Override
	public int getTotal(int com_bno) {
		// TODO Auto-generated method stub
		return mapper.getTotal(com_bno);
	}

	@Override
	public List<CommentVO> myRecord(String writer) {
		return mapper.myRecord(writer);
	}

	@Override
	public void commentDelete(CommentVO vo) {
		mapper.commentDelete(vo);
		
	}
	
	@Override
	public List<CommentVO> getComList(String com_wrtier) {
		return mapper.getComList(com_wrtier);
	}

}

오늘 필요한 메소드는 CommentRegist 와 getList , getTotal 까지 이다. 

 

 


컨트롤러 및 마이바티스에 들어가는 매퍼를 제작해보자 

 

매퍼 xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
  <mapper namespace="com.community.shy.board.JobComment.mapper.ICommentMapper">
  	
  	<insert id="CommentRegist">
  		insert into job_comment(com_no,com_writer,com_content,com_like,com_hate,re_com,com_type,com_bno)
		values (COMMENT_SEQ.nextval ,#{com_writer},#{com_content},0,0,1,1,#{com_bno})
  	</insert>
  	
  	<select id="getTotal" resultType="int">
  		select count(*) from job_comment where com_bno = #{com_bno}
  	</select>
  	
  	<select id="getList" resultType="com.community.shy.board.command.CommentVO">
  		select * from job_comment where com_bno = #{com_bno}
  	</select>
  	
  	<select id="myRecord" resultType="com.community.shy.board.command.CommentVO">
		SELECT * FROM job_comment
		WHERE com_writer = #{writer}
	</select>
	
	<delete id="commentDelete">
		DELETE FROM job_comment
		WHERE com_writer = #{com_writer} AND com_content = #{com_content}
	</delete>
	
	<select id="getComList" resultType="com.community.shy.board.command.CommentVO">
        select * from job_comment where com_writer = #{com_writer}
     </select>
	
  </mapper>
@RestController
@RequestMapping("/Comment")
public class CommentController {
	
	@Autowired
	private ICommentService service;
	
	@PostMapping("/InsertComment")
	public String InsertComment(@RequestBody CommentVO vo,HttpSession session) {
		System.out.println("댓글 등록 통신 성공");
		if(session.getAttribute("login") == null) {
			return "fail";
		} else {
			System.out.println("로긘함. 스크랩 진행");
			
			service.CommentRegist(vo);
			System.out.println("댓글 등록 서비스 성공");
			return "InsertSuccess";
		}
	}

	@GetMapping("/CommentList/{com_bno}")
	public Map<String, Object> getList(@PathVariable int com_bno, Model model) {
		System.out.println("댓글 목록 컨트롤러 동작");
		List<CommentVO> list = service.getList(com_bno);
		int total = service.getTotal(com_bno);
		
		ModelAndView view = new ModelAndView();
		System.out.println("댓글 갯수 " + service.getTotal(com_bno));
		view.setViewName("/board/JBoardList");
		Map<String, Object> map = new HashMap<>();
		map.put("list", list);
		map.put("total", total);
		
		return map;
	}

컨트롤러 같은경우에 ajax로 동작시키려고 한다.

그렇기 떄문에 RestControolaer를 활용하자 

 

그 후 세션 객체를 활용 하여 로그인 검증 한번 해주고

댓글 등록에 대한 로직이 돌아가 도록 서비스 객체에서 댓글 등록 인서트문 을 돌려준다. 

 

이제 jsp를 보자! :) 

 

 

                <div class="comment-box">
                    
   		                 <div class="comment-count">댓글 <span id="count">0</span></div>

   		                 	   <!-- <span class="c-icon"><i class="fa-solid fa-user"></i>  -->
   		                 <div class="comment-name">
	                        <span class="anonym">작성자 : 
	                    	    <input type="text" class="form-control" id="com_writer" placeholder="이름" name ="com_writer" value='${login.userId}' readonly  style="width: 100px; border:none;">
	                        </span>
	                      </div>   
	                        	
	                        <!-- </span> -->
                     <!--<img src="/익명.jpg" width ="50px" alt="My Image"><!-->
                    <div class="comment-sbox">
                        <textarea class="comment-input" id="com_content" cols="80" rows="2" name="com_content" ></textarea>
                        <!-- <span class="com-function-btn" type="hidden">
                            
                            <a href="#"><i class="fa-solid fa-pen-to-square"></i></a>
                            <a href="#"><i class="fa-solid fa-trash-can"></i></a>
                         </span> -->
                    </div>
                    	<div class="regBtn">
                    		<button id="Comment_regist"> 댓글등록</button>
                    	 </div>

작성하면 대략 

이런 화면을 가진 창이 나타내게 된다. 

 

그 후 댓글 등록을 누르게 되면  다른 div 박스 안에 계속 list가 채워 지는 형식으로 진행 할 것이다. 

 

<div class="comment_Box" style="border:1px solid gray;"> <!-- 댓글이 들어갈 박스 -->

	                </div>

이제 ajax 를 작성해보자 

 

$('#Comment_regist').click(function() {
			
   			//Json으로 전달할 파라미터 변수선언
   			const com_bno = ${board_no};
   			const com_writer = $('#com_writer').val();
   			const com_content = $('#com_content').val();
   			
   			console.log(com_bno);
   			console.log(com_writer);
   			console.log(com_content);
   		
   			if(com_writer == ''){
   				alert('로그인 후 이용해주세요');
   				return;
   			}else if(com_content == '') {
   				alert('내용을 입력하세요');
   			}
   			
   			$.ajax({
   				type:'post',
   				url:'<c:url value="/Comment/InsertComment"/>',
   				data: JSON.stringify(
   					{
   						"com_bno":com_bno,
   						"com_writer":com_writer,
   						"com_content":com_content
   					}		
   				),
   				contentType: 'application/json',
   				success:function(data){
   					console.log('통신성공' + data);
   					if(data === 'InsertSuccess') {
   						alert('댓글 등록이 완료되었습니다.');
   						console.log('댓글 등록 완료');
   						$('#com_writer').val(com_writer);
   	   					$('#com_content').val('');
   	   					getList();
   					} else {
   						alert('로그인 이후 이용해주시기 바랍니다.');
   						console.log('댓글 등록 실패');
   					}
   				},
   				error:function(){
   					alert('통신실패');
   				}
   			});// 댓글 비동기 끝
   			
		});// 댓글등록 이벤트 끝
		
		getList();

우선 Json으로 전달할 파라미터를 const로 변수 선언을 해준다. 

이것이 이제 컨트롤러로 들어가 매퍼를 거쳐 디비에 저장될 값이다. 

 

그후 검증을 통해 빈값 체크 및 로그인을 하지 않았을 경우 등을 걸러준다. 

그 후 ajax를 통해 입력 받은 데이터를 컨트롤러로 넘겨준다. 

 

이때 ajax를 통해 getList라는 메소드가 ㄴ발동 되게 되는데 이것은 리스트를 불러오는 것이다 

작성된 글을 실시간으로 비동기 식으로 보여주어  페이지 로딩없이 바로 보여준다. 

 

getList는 getJson으로 해보자

 

ajax와 getJson의 차이점은 

async 옵션은 기본적으로 true 가 default 인데, false 로 하면 백그라운드로 진행하는게 아니라 순차적으로 진행되어  제대로된 .ajax 를 사용하는게 아닐지 모르지만 화면을 보는 관점에서는 더자연스럽게 느껴진다.

 

     또한, 백그라운드로 진행하면 안되는 작업을 할 때는 async옵션을 false로 주어야 한다.

 

 

		function getList() {
			
			const com_bno = ${board_no};
			const com_writer = $('#com_writer').val();
   			const com_content = $('#com_content').val();
   			/* const com_no = ${com}; */
			$.getJSON(
				"<c:url value='/Comment/CommentList/'/>"+com_bno,
				function(data) {
					if(data.total > 0){
						var list = data.list;
						
						var comment_html = "<div>";
						
						$('#count').html(data.total);
						for(i = 0;i < list.length;i++){
							var content = list[i].com_content;
							var writer = list[i].com_writer;
							comment_html += "<div><span id='com_writer'><strong>" + writer + "</strong></span><br/>";
							comment_html += "<span id='com-content'>" + content + "</span><br>";
							if(writer === $("#com_writer").val()){
								 comment_html += "<span id='delete' style='cursor:pointer;' data-id ="+content+">[삭제]</span><br></div><hr>";
								 
							}
							else{
								comment_html += "</div><hr>";
							}
						}
						
						$(".comment_Box").html(comment_html);
						
						
					}
					else{
						var comment_html = "<div>등록된 댓글이 없습니다.</div>";
						$(".comment_Box").html(comment_html);
					}
			
				
				}
				);//getJson



getJson도 우선 글을 불러오기 위해 글 번호를 받는다. 

그 뒤에 컨트롤러에 접근하기위해 글 번호를 묻혀 보낸다. 

이떄 데이터 크기가 0코다 클경우로 설정하여 

 

댓글이 0개 일시 등록된 댓글이 없다고 표기해준다. 

 

그 후 컨트롤러에서 뿌려진 정보를 data 반복문을 통해 

이 글 번호에 등록된 댓글을 계속 뿌려주고 

이때 계속 += div asdasd .</div>

이렇게 계속 html 코드가 이어지도록 반복문을 작성한뒤 

 

제이쿼리 html() 로 붙여 넣어주면 댓글 작성이 끝나게 된다. 

 

https://github.com/MoonSeokHyun/JobJob_community

 

GitHub - MoonSeokHyun/JobJob_community

Contribute to MoonSeokHyun/JobJob_community development by creating an account on GitHub.

github.com

 

 

반응형
반응형

우선 재료준비
1) 시금치 200g
2) 올리브유 120ml
3) 견과류 (나는 캐슈넛씀)
소금 1 티스푼
설탕 0.5 티스푼
후추 0.5 티스푼
마늘 4조각
비건 치즈 조금? 없어도됨 다만 넣으면 치즈 풍미가 좋음



뜨거운 물에 약 30초 정도 데친 후 건져내어
물기를 쫙 짜준다 .


그후

블랜더에 준비한 재료를 다넣고 갈아준다.

끝이다.

정말 간단하다

완성된 모습

이제 파스타를 만들어 보자







통밀 파스타라 약 10분 정도 삻아 준다.

아 맞다 재료는 파스타 + 페스토 + 빈즈 끝이다.


요론식으로 파스타를 볶아준다.




정말 간단하다
맛은 맛있엇다.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

비건 레시피지만 내가 항상 생각하는 비건 레시피는 그냥
고기 뺸 요리다 모든 동물성식품을 뺀음식
바로 위와같이 비건식품도 잘만 만들면 맛있다

약 3달간 비건 라이프 ㄲ

핀란드 2일차 끝~!

반응형

+ Recent posts