When a program running in the background attempts to read from the terminal, it is stopped by a SIGTTIN signal. The input is currently going to the foreground process¹; it would be disruptive if input randomly went to the foreground program or the background program. So the background program is suspended until it's put in the foreground.
If you only need to pass data to your program at the beginning, pipe the data into it.
echo "config=foo" | ./my_app &
If you need to interact with the program now and then, but it can go on executing unattended most of the time, run it in a terminal multiplexer such as Screen or Tmux. For example, with screen:
screen -S my_app ./my_app
Type the necessary input, then press Ctrl+A to detach the screen session, i.e. let it run in the background and go back to the original terminal. When you want to interact with the program again, reattach to the screen session:
screen -S my_app -rd
If you need to perform some complex interactions automatically, write an expect script (or a script in another language with a similar library).
¹ Process group but I'm not going to go into that subtlety here.